簡體   English   中英

將列表列表與字典相結合

[英]Combining list of lists with dictionaries

感謝所有在這里提供幫助的人。

我有一個列表列表。 這些列表包含如下字典:

combined lists = [
        [
            {'COMPANY': 'company1', 'NUMBER': '111', 'SHIPMENTS': ['1', '2', '3', '4']},
            {'COMPANY': 'company2', 'NUMBER': '222', 'SHIPMENTS': ['1']},
            {'COMPANY': 'company3', 'NUMBER': '333', 'SHIPMENTS': ['1', '4']},
            {'COMPANY': 'company4', 'NUMBER': '444', 'SHIPMENTS': ['2', '5']},
            {'COMPANY': 'company5', 'NUMBER': '555', 'SHIPMENTS': ['1', '3', '5', '9']}
        ], 
        [
            {'COMPANY': 'company1', 'NUMBER': '111', 'SHIPMENTS': ['5', '6', '7', '8']},
            {'COMPANY': 'company3', 'NUMBER': '333', 'SHIPMENTS': ['3', '5']},
            {'COMPANY': 'company5', 'NUMBER': '555', 'SHIPMENTS': ['3', '5', '7']},
            {'COMPANY': 'company7', 'NUMBER': '777', 'SHIPMENTS': ['2', '4']},
            {'COMPANY': 'company9', 'NUMBER': '999', 'SHIPMENTS': ['1', '2', '5', '6', '7']}
        ], 
    ]

我根據COMPANYSHIPMENTS組合這些列表,並且我希望沒有重復的SHIPMENTS值。 NUMBER鍵/值無關緊要。

最終的 output 理想情況下是一個看起來像這樣的字典列表,其中公司的出貨量全部合並:

final_list = [
        {'COMPANY': 'company1', 'SHIPMENTS': ['1', '2', '3', '4', '5', '6', '7', '8']},
        {'COMPANY': 'company2', 'SHIPMENTS': ['1']},
        {'COMPANY': 'company3', 'SHIPMENTS': ['1', '4', '3', '5']},
        {'COMPANY': 'company4', 'SHIPMENTS': ['2', '5']},
        {'COMPANY': 'company5', 'SHIPMENTS': ['1', '3', '5', '7', '9']},
        {'COMPANY': 'company7', 'SHIPMENTS': ['2', '4']},
        {'COMPANY': 'company9', 'SHIPMENTS': ['1', '2', '5', '6', '7']}
    ]

我知道我沒有提供任何我嘗試過的東西,但主要是尋找如何接近最終的 output。 如果這很重要,我正在使用 python3.6

這是一個解決方案,它使用集合來確保沒有重復,但它會丟失發貨順序。

from itertools import chain

combined_lists = [
    [
        {'COMPANY': 'company1', 'NUMBER': '111', 'SHIPMENTS': ['1', '2', '3', '4']},
        {'COMPANY': 'company2', 'NUMBER': '222', 'SHIPMENTS': ['1']},
        {'COMPANY': 'company3', 'NUMBER': '333', 'SHIPMENTS': ['1', '4']},
        {'COMPANY': 'company4', 'NUMBER': '444', 'SHIPMENTS': ['2', '5']},
        {'COMPANY': 'company5', 'NUMBER': '555', 'SHIPMENTS': ['1', '3', '5', '9']}
    ],
    [
        {'COMPANY': 'company1', 'NUMBER': '111', 'SHIPMENTS': ['5', '6', '7', '8']},
        {'COMPANY': 'company3', 'NUMBER': '333', 'SHIPMENTS': ['3', '5']},
        {'COMPANY': 'company5', 'NUMBER': '555', 'SHIPMENTS': ['3', '5', '7']},
        {'COMPANY': 'company7', 'NUMBER': '777', 'SHIPMENTS': ['2', '4']},
        {'COMPANY': 'company9', 'NUMBER': '999', 'SHIPMENTS': ['1', '2', '5', '6', '7']}
    ]
]

COMPANY_KEY = 'COMPANY'
SHIPMENTS_KEY = 'SHIPMENTS'

# you're looking to:
# - combine the lists
# - drop the number
# - combine the shipments, removing duplicates
final_dict = {}
for d in chain.from_iterable(combined_lists):
    key = d[COMPANY_KEY]
    if key in final_dict:
        final_dict[key][SHIPMENTS_KEY].update(*d[SHIPMENTS_KEY])
    else:
        final_dict[key] = {SHIPMENTS_KEY: set(d[SHIPMENTS_KEY])}
print(final_dict)

# if you need a list, not a dict
final_list = [{COMPANY_KEY: key, SHIPMENTS_KEY: value} for key, value in final_dict.items()]
print(final_list)

請注意,如果您只需要一份貨運清單,而這確實是您字典中唯一的內容,那么更簡單的解決方案是:

from collections import defaultdict

better_dict = defaultdict(set)
for d in chain.from_iterable(combined_lists):
    better_dict[d[COMPANY_KEY]].update(*d[SHIPMENTS_KEY])
print(better_dict)

我認為這應該可以解決您的問題

import collections

merged = collections.defaultdict(list)

for x in combined_lists:
    for y in x:
        merged[y["COMPANY"]] += y["SHIPMENT"]
final_list = []
for x in merged:
    final_list.append({"COMPANY": x, "SHIPMENT": merged[x]})

這樣就解決了問題,試一試,你可以優化代碼以獲得更好的性能。

def company_exists(company, resulting_list):
    for i,dict_ in enumerate(resulting_list):
        if company == dict_['COMPANY']:
            return i, True
    return None, False


def merge_lists(combined_lists):
    res = []

    for list_ in combined_lists:
        for dict_ in list_:
            idx, check = company_exists(dict_['COMPANY'], res)
            if not check:
                res.append(dict_)
            else:
                res[idx]['SHIPMENTS'].extend(dict_['SHIPMENTS'])
                res[idx]['SHIPMENTS'] = list(set(res[idx]['SHIPMENTS']))

    return res

希望,它有幫助。

暫無
暫無

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

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