2016-01-23 74 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