首页 > 解决方案 > 将字典列表与公共键组合而不合并值

问题描述

我有多个字典列表如下:

data_aus =
[{'name': '2018,7', 'aus_ct': 13}, {'name': '2018,8', 'aus_ct': 3}, {'name': '2018,9', 'aus_ct': 3}]

data_asia = 
[{'name': '2018,7', 'asia_ct': 10}, {'name': '2018,8', 'asia_ct': 11}, {'name': '2018,9', 'asia_ct': 6}]

data_us =
[{'name': '2018,7', 'us_ct': 5}, {'name': '2018,8', 'us_ct': 8}, {'name': '2018,9', 'us_ct': 9}, {'name': '2018,10', 'us_ct': 23}]

data_uk =
[{'name': '2018,7', 'uk_ct': 15}, {'name': '2018,8', 'uk_ct': 7}, {'name': '2018,9', 'uk_ct': 13}]

我想将这些列表组合成一个字典列表,该列表基于一个名为name.

结果应如下所示:

data_combined = [
{'name': '2018,7', 'aus_ct': 13, 'asia_ct': 10, 'us_ct': 5, 'uk_ct':15},
{'name': '2018,8', 'aus_ct': 3, 'asia_ct': 11, 'us_ct': 8, 'uk_ct':7},
...]

有没有一种简单的方法可以做到这一点?请帮忙。

标签: python-3.x

解决方案


1) 将所有数据准备到一个列表中,并在您的数据中找到所有可用的月份。

# Put all data into a single list
all_data = [month_data for country_data in [data_aus, data_asia, data_us, data_uk] for month_data in country_data]

# Figure out the months available
months = set(map(lambda entry: entry['name'], all_data))

2)通过逐月迭代并加入字典来合并数据。

data_combined = []
# Iterate month by month
for month in months:

    # Get all the data from a single month (list of dicts)
    month_data = filter(lambda entry: entry['name'] == month, all_data)

    # "Tricky part" merge the list of dictionaries
    sigle_month_data = {k: v for d in month_data for k, v in d.items()}

    # Append to the overall combined list
    data_combined.append(single_month_data)

3) 结果

print(data_combined)


{'uk_ct': 15, 'asia_ct': 10, 'aus_ct': 13, 'us_ct': 5, 'name': '2018,7'}
{'uk_ct': 7, 'asia_ct': 11, 'aus_ct': 3, 'us_ct': 8, 'name': '2018,8'}
{'uk_ct': 13, 'asia_ct': 6, 'aus_ct': 3, 'us_ct': 9, 'name': '2018,9'}
{'us_ct': 23, 'name': '2018,10'}

推荐阅读