簡體   English   中英

創建一個新的字典列表,在n個字典列表之間共有?

[英]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.

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