Python将字典列表转换为另一个字典列表

4

我有一个Python字典列表。以下是一个虚构的例子,其中包含头发颜色和种族。

some_list = [
        {'blond': 3, 'race': 'WHITE'},
        {'black': 4, 'race': 'WHITE'},
        {'light brown': 6, 'race': 'WHITE'},
        {'black': 2, 'race': 'AFRICAN_AMERICAN'},
        {'blond': 1, 'race': 'AFRICAN_AMERICAN'},
        {'dark brown': 1, 'race': 'AFRICAN_AMERICAN'}
]

头发颜色是其中一个键,头发颜色的值是给定种族拥有该头发颜色的人数。我不知道有多少种头发颜色,也不知道有多少种族。我想将此列表转换为包括所有种族的所有头发颜色的计数,以便结果包括对于未在给定种族中列出的颜色的0计数:

some_list = [
        {'blond': 3, 'race': 'WHITE'},
        {'black': 4, 'race': 'WHITE'},
        {'light brown': 6, 'race': 'WHITE'},
        {'dark brown': 0, 'race': 'WHITE'},
        {'black': 2, 'race': 'AFRICAN_AMERICAN'},
        {'blond': 1, 'race': 'AFRICAN_AMERICAN'},
        {'dark brown': 1, 'race': 'AFRICAN_AMERICAN'},
        {'light brown': 0, 'race': 'AFRICAN_AMERICAN'}
]

就我而言,我无法想出一个简单的“Python”方法来轻松地完成这个任务。肯定有一些技巧吧?有人知道解决这个问题的简洁方法吗?


1
展示一下你尝试过的内容。我也认为你选择的数据结构有点奇怪。 - L3viathan
您可以使用迭代,并使用 set(..) 查找唯一的颜色/种族,然后使用 itertools.product(..) 查找所有组合。在 some_list 中没有条目的地方填充零。告诉我们您卡住了哪里。 - UltraInstinct
这就是我卡住的地方...我已经有了一个独特的列表...就像第一段代码片段中所示...但我不知道一个好的方法来迭代并填充给定种族缺失的头发颜色。itertools.product(..)如何帮助? - Brent
1个回答

1
如果我正确理解了你的问题,并且你能够使用外部库,你可以通过 pandas 实现这一点:
import pandas as pd

df = pd.DataFrame(some_list, index=None)

df = df.groupby(by='race').count().transpose()

for col in df.columns:
    rw = df.loc[df[col] == 0]
    dic = {rw.index[0]: 0, 'race': col}
    some_list.append(dic)

# output:
# some_list = [
#     {'blond': 3, 'race': 'WHITE'},
#     {'black': 4, 'race': 'WHITE'},
#     {'light brown': 6, 'race': 'WHITE'},
#     {'black': 2, 'race': 'AFRICAN_AMERICAN'},
#     {'blond': 1, 'race': 'AFRICAN_AMERICAN'},
#     {'dark brown': 1, 'race': 'AFRICAN_AMERICAN'},
#     {'light brown': 0, 'race': 'AFRICAN_AMERICAN'},
#     {'dark brown': 0, 'race': 'WHITE'}
# ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接