2016-05-17 290 views
3

我有一个Python的字典列表。这是一个与头发颜色和种族相关的示例。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

+0

您可以迭代并使用'set(..)'查找唯一的颜色/种族,然后使用'itertools.product(..)'查找所有组合。填入零,你不会在'some_list'中输入。告诉我们你卡在哪里。 – SuperSaiyan

+0

多数民众赞成在那里我被卡住了......我有一个独特的名单已经...如第一个代码片段所示...但我不知道一个好方法迭代并填写缺少的头发颜色给定种族。 itertools.product(..)如何提供帮助? – Brent

回答

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'} 
# ]