![](/img/trans.png)
[英]How to create new list of dicts in python by consolidating dicts in another list?
[英]Create a new list of dicts in common between n lists of dicts?
我有數量未知的產品結果列表,它們都是具有相同鍵的字典條目。 我想生成一個出現在所有舊列表中的新產品列表。
“所有城市都有哪些產品?”
給出:
list1 = [{'id': 1, 'name': 'bat', 'price': 20.00}, {'id': 2, 'name': 'ball', 'price': 12.00}, {'id': 3, 'name': 'brick', 'price': 19.00}]
list2 = [{'id': 1, 'name': 'bat', 'price': 18.00}, {'id': 3, 'name': 'brick', 'price': 11.00}, {'id': 2, 'name': 'ball', 'price': 17.00}]
list3 = [{'id': 1, 'name': 'bat', 'price': 16.00}, {'id': 4, 'name': 'boat', 'price': 10.00}, {'id': 3, 'name': 'brick', 'price': 15.00}]
list4 = [{'id': 1, 'name': 'bat', 'price': 14.00}, {'id': 2, 'name': 'ball', 'price': 9.00}, {'id': 3, 'name': 'brick', 'price': 13.00}]
list...
我想要一個列表,其中所有舊列表中都存在“ id”:
result_list = [{'id': 1, 'name': 'bat}, {'id': 3, 'name': 'brick}]
對於給定的“ id”不是恆定的值可以被丟棄,但是對於給定的“ id”相同的值必須在結果列表中。
如果我知道我有多少列表,我可以這樣做:
results_list = []
for dict in list1:
if any(dict['id'] == d['id'] for d in list2):
if any(dict['id'] == d['id'] for d in list3):
if any(dict['id'] == d['id'] for d in list4):
results_list.append(dict)
如果我不知道有多少個清單,該怎么辦?
把id
s轉換set
秒,然后走的路口set
秒。
list1 = [{'id': 1, 'name': 'steve'}, {'id': 2, 'name': 'john'}, {'id': 3, 'name': 'mary'}]
list2 = [{'id': 1, 'name': 'jake'}, {'id': 3, 'name': 'tara'}, {'id': 2, 'name': 'bill'}]
list3 = [{'id': 1, 'name': 'peter'}, {'id': 4, 'name': 'rick'}, {'id': 3, 'name': 'marci'}]
list4 = [{'id': 1, 'name': 'susan'}, {'id': 2, 'name': 'evan'}, {'id': 3, 'name': 'tom'}]
lists = [list1, list2, list3, list4]
sets = [set(x['id'] for x in lst) for lst in lists]
intersection = set.intersection(*sets)
print(intersection)
結果:
{1, 3}
請注意,我們將類方法set.intersection
而不是實例方法set().intersection
,因為后者將其參數與空set()
相交,當然,任何與空set的交集也為空。
如果您想將其轉換為字典列表,則可以執行以下操作:
result = [{'id': i, 'name': None} for i in intersection]
print(result)
結果:
[{'id': 1, 'name': None}, {'id': 3, 'name': None}]
現在,如果您還想保留對於給定id
所有實例都相同的那些屬性,則需要執行以下操作:
list1 = [{'id': 1, 'name': 'bat', 'price': 20.00}, {'id': 2, 'name': 'ball', 'price': 12.00}, {'id': 3, 'name': 'brick', 'price': 19.00}]
list2 = [{'id': 1, 'name': 'bat', 'price': 18.00}, {'id': 3, 'name': 'brick', 'price': 11.00}, {'id': 2, 'name': 'ball', 'price': 17.00}]
list3 = [{'id': 1, 'name': 'bat', 'price': 16.00}, {'id': 4, 'name': 'boat', 'price': 10.00}, {'id': 3, 'name': 'brick', 'price': 15.00}]
list4 = [{'id': 1, 'name': 'bat', 'price': 14.00}, {'id': 2, 'name': 'ball', 'price': 9.00}, {'id': 3, 'name': 'brick', 'price': 13.00}]
lists = [list1, list2, list3, list4]
sets = [set(x['id'] for x in lst) for lst in lists]
intersection = set.intersection(*sets)
all_keys = set(lists[0][0].keys())
result = []
for ident in intersection:
res = [dic for lst in lists
for dic in lst
if dic['id'] == ident]
replicated_keys = []
for key in all_keys:
if len(set(dic[key] for dic in res)) == 1:
replicated_keys.append(key)
result.append({key: res[0][key] for key in replicated_keys})
print(result)
結果:
[{'id': 1, 'name': 'bat'}, {'id': 3, 'name': 'brick'}]
我們在這里做的是:
intersection
處的每個id
並獲取與該id
對應的每個字典。 id
)。 result
此代碼假定:
list1, list2, ...
每個字典將具有相同的鍵。 如果這個假設是錯誤的,請讓我知道-放松並不難。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.