Python 根据键将字典列表分组为值列表

Python 根据键将字典列表分组为值列表,python,python-3.x,list,dictionary,group-by,Python,Python 3.x,List,Dictionary,Group By,以下是字典列表 [{'12': 'carrom', 'name': 'tom'}, {'7': 'tennis', 'name': 'tom'}, {'5': 'cycling', 'name': 'tom'}, {'9': 'tennis', 'name': 'sam'}] 如何以以下格式构建列表理解 {'tom' : [12,7,5], 'sam' : [9]} 了解到每个字典只有两个键,您需要循环遍历每个字典并将其附加到defaultdict: 请注意,这会在字典中进行破

以下是字典列表

 [{'12': 'carrom', 'name': 'tom'}, 
 {'7': 'tennis', 'name': 'tom'}, 
 {'5': 'cycling', 'name': 'tom'},
 {'9': 'tennis', 'name': 'sam'}]
如何以以下格式构建列表理解

{'tom' : [12,7,5], 'sam' : [9]} 

了解到每个字典只有两个键,您需要循环遍历每个字典并将其附加到defaultdict:

请注意,这会在字典中进行破坏性迭代。要获得d作为一个普通的dict,请使用

d = dict(d)
因为defaultdict是dict的一个子类

另一个选项是pandas,因为您拥有库:

df = pd.DataFrame(lst).set_index('name')
df
          12        5       7       9
name                                 
tom   carrom      NaN     NaN     NaN
tom      NaN      NaN  tennis     NaN
tom      NaN  cycling     NaN     NaN
sam      NaN      NaN     NaN  tennis

df.notna().dot(df.columns).groupby(level=0).agg(list).to_dict()
# {'sam': ['9'], 'tom': ['12', '7', '5']}
您可以先使用itertools.groupby对词典列表进行分组

from itertools import groupby
groupby_list = [list(g) for k, g in groupby(alist, key=lambda x: x['name'])]
将输出一个列表

[[{'12': 'carrom', 'name': 'tom'},
  {'7': 'tennis', 'name': 'tom'},
  {'5': 'cycling', 'name': 'tom'}],
[{'9': 'tennis', 'name': 'sam'}]]
然后,您必须获取每个嵌套列表的键,并使用isdigit方法过滤字符串键。我把它组合成一个有点复杂的长理解表达式

[{group[0]['name'] : [int(number) for number in list(set().union(*(d.keys() for d in list(group)))) if number.isdigit()]} for group in groupby_list]
结果就是你想要的:

[{'tom': [12, 7, 5]}, {'sam': [9]}]
希望这个答案会有帮助

干杯

your_list_name = [i['name'] for i in your_list]
your_list_name 
    ['tom', 'tom', 'tom', 'sam']

your_list_keys = [i.keys() for i in your_list]
your_list_digit_keys = [[item for item in sublist  if item.isdigit()==True] for sublist in your_list_keys]
your_list_digit_keys = [item for sublist in your_list_digit_keys for item in sublist]
your_list_digit_keys = list(map(int, your_list_digit_keys))
your_list_digit_keys
    [12, 7, 5, 9]

my_dict={} # Initializing the dictionary
for i in range(len(your_list_name)):
    key = your_list_name[i]
    if key in my_dict:
        my_dict[key] += [your_list_digit_keys[i]]
    else:
        my_dict[key] = [your_list_digit_keys[i]]

my_dict
    {'sam': [9], 'tom': [12, 7, 5]}
your_list_name = [i['name'] for i in your_list]
your_list_name 
    ['tom', 'tom', 'tom', 'sam']

your_list_keys = [i.keys() for i in your_list]
your_list_digit_keys = [[item for item in sublist  if item.isdigit()==True] for sublist in your_list_keys]
your_list_digit_keys = [item for sublist in your_list_digit_keys for item in sublist]
your_list_digit_keys = list(map(int, your_list_digit_keys))
your_list_digit_keys
    [12, 7, 5, 9]

my_dict={} # Initializing the dictionary
for i in range(len(your_list_name)):
    key = your_list_name[i]
    if key in my_dict:
        my_dict[key] += [your_list_digit_keys[i]]
    else:
        my_dict[key] = [your_list_digit_keys[i]]

my_dict
    {'sam': [9], 'tom': [12, 7, 5]}