2016-01-23 41 views
0

我想比较两个列表中的python并覆盖部分匹配从一个到另一个或添加任何新的东西。例如:比较两个列表和覆盖/从另一个附加

new_list:

Jason £420 
Adam £205 
Emma £670 
Tim £900 
Penny £120 
Ed £470 

old_list:

Jason £200 
Adam £205 
Alex £400 
Emma £600 
Penny £120 

我想,如果他们是从new_list(如贾森)不同来更新old_list项目,增加新项目(例如Tim),并保留不在new_list中的旧物品(例如Alex),得到像这样的东西:

Jason £420 
Adam £205 
Alex £400 
Emma £670 
Penny £120 
Tim £900 
Ed £470 

我一直在t试图用for循环来做到这一点,但我认为我陷入了困境。得到这个至今:

for x, y in enumerate(old_list): 
     for z in new_list: 
       if z.split(" ")[0] in y: 
         old_list[x] = z 
       elif z.split(" ")[0] not in old_list: 
         old_list.append(z) 
       else: 
         pass 
+2

为什么不使用'dict'是什么? –

+0

“我觉得我陷入困境”并不是一个错误destription。试着先描述一下你想用人类语言做什么,然后尝试将它翻译成Python。如果您遇到问题,请提出具体问题。 –

回答

3

你可以使用一个dict,但是如果你需要保持在有序列表中的元素,你可以使用OrderedDict这样的:

from collections import OrderedDict 

old_d = OrderedDict({'John': 100, 'Marie': 200}) 
new_d = OrderedDict({'John': 100, 'Marie': 400}) # Marie changes here 

# important part, update keys from old_d with values of new_d 
# also adds new key-value from new_d 
old_d.update(new_d) # update keys 

print(old_d) # OrderedDict([('John', 100), ('Marie', 400)]) 
your_final_list = old_d.items() 
2

为什么跟进dict是这里的正确答案是检查dict.update()方法的文档:https://docs.python.org/2/library/stdtypes.html#dict.update

使用其他键/值对更新字典,覆盖现有密钥 。

这正是你要找的行为:

old_dict = {"Jason": 200, "Emma": 40} 
new_dict = {"Tim": 10, "Jason": 420 } 

old_dict.update(new_dict) 
print old_dict 
{"Jason": 420, "Emma": 40, "Tim": 10} 

如果您需要访问的元素在一个特定的顺序,然后使用上old_dict.keys()一个sorted()给你足够的可能性,以实现任何需求排序你可能有。

1

你的问题是好得多与dict但要解决。解决与list,使用map

names_old = list(map(lambda x: x.split()[0], old_list)) 
names_new = list(map(lambda x: x.split()[0], new_list)) 

for x, y in enumerate(names_new): 
    item = new_list[names_new.index(y)] 
    if y in names_old: 
     old_list[names_old.index(y)] = item 
    else: 
     old_list.append(item) 

In [676]: old_list 
Out[676]: 
['Jason £420', 
'Adam £205', 
'Alex £400', 
'Emma £670', 
'Penny £120', 
'Tim £900', 
'Ed £470'] 
+0

FTR,列表解析更pythonic'names_old = [x.split()[0] for old_list]' – Aprillion