簡體   English   中英

比較python 2中的兩個字典列表

[英]compare two list of dicts in python 2

我想在python中比較兩個字典列表,我從前端發送了一個列表,並將查詢結果存儲在同一函數中,所以我要做的就是比較兩個列表和關鍵barcode ,如果它們匹配我想要的將第二個字典中的name附加到第一個字典中

例如:

data_from_frontend = [
    { barcode: '1', name_en: 'milk' },
    { barcode: '2', name_en: 'water' },
    { barcode: '3', name_en: 'cheese' },
    { barcode: '10', name_en: 'pepsi' },
]
result_from_query = [
    { barcode: '1', name: 'PID012343' },
    { barcode: '2', name: 'PID123454' },
    { barcode: '10', name: 'PID123432' },
]

我想比較兩個列表和barcode ,如果它們匹配,我想將兩個變量對合並為一個新的變量+將一個不匹配的變量與另一個列表相加,因此結果將是兩個具有[matched + name]not_found變量,如何實現?

這是我嘗試過的

equal = []
not_equal = []
no_barcode = []
x = [ { "age": "22" }, { "name": "John Doe" }, { "name": "Jane Doe" }, { "name": "Doctor" }, { "name": "Engineer" } ]
y = [ { "name": "Engineer" }, { "name": "Jane Doe" }, { "name": "Doctor" } ]
x_sort = sorted(x, key=lambda k: ("name" not in k, k.get("name", None)))
y_sort = sorted(y, key=lambda k: ("name" not in k, k.get("name", None)))
print(y_sort)
for x_val in x_sort:
    if "name" not in x_val.keys():
        no_barcode.append(x_val)
    else:
        for y_val in y_sort:
            if x_val["name"] == y_val["name"]:
                equal.append(x_val)
                mapped = map(lambda k: k["name"], y_sort)
                if x_val["name"] not in mapped:
                    not_equal.append(x_val)
print('equal')
print(equal)
print('not equal')
print(not_equal)

首先,您應該修復dict鍵並將其括在引號中。

然后,您可以使用生成器表達式來查找項目,例如:

print('initial dict:')
pprint.pprint(data_from_frontend)

for item in result_from_query:
    item_found = next((i for i in data_from_frontend if i['barcode'] == item['barcode']), False)
    if item_found:
        item_found['name'] = item['name']

print('dict after search:')
pprint.pprint(data_from_frontend)

將產生:

initial dict:
[{'barcode': '1', 'name_en': 'milk'},
 {'barcode': '2', 'name_en': 'water'},
 {'barcode': '3', 'name_en': 'cheese'},
 {'barcode': '10', 'name_en': 'pepsi'}]
dict after search:
[{'barcode': '1', 'name': 'PID012343', 'name_en': 'milk'},
 {'barcode': '2', 'name': 'PID123454', 'name_en': 'water'},
 {'barcode': '3', 'name_en': 'cheese'},
 {'barcode': '10', 'name': 'PID123432', 'name_en': 'pepsi'}]

在生成器中使用False可以避免在目標字典中不存在的條形碼值搜索時出錯。

PS不要忘記導入pprint如果要使用它)

PPS,並確保您可以使用相同的邏輯創建新字典而不是修改現有字典

您的條形碼匹配結果可以像這樣。

barcode = 'barcode'
name_en = 'name_en'
name = 'name'

matching_result = data_from_frontend[:] #get a copy of front end data to use as the output

for i in range(len(data_from_frontend)):
    for j in range(len(result_from_query)):
        if(data_from_frontend[i][barcode] == result_from_query[j][barcode]):
            matching_result[i][name] = result_from_query[j][name]
            break

print(matching_result)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM