我有一个字典列表,如何按值对该列表进行分组。
list = [{a:1},{b:2},{c:1},{d:3},{e:2}]
现在我的结果应该像下面这样。
1:a,c
2:b,e
3:d
我尝试使用
itertools
中的groupby
,但是我无法得到所需的结果。我正在使用Python 2.7。你能帮我实现这个吗?
我有一个字典列表,如何按值对该列表进行分组。
list = [{a:1},{b:2},{c:1},{d:3},{e:2}]
1:a,c
2:b,e
3:d
itertools
中的groupby
,但是我无法得到所需的结果。我正在使用Python 2.7。如果你想使用groupby
,那么列表必须按照你想要分组的相同键进行排序
。
>>> lst = [{'a':1}, {'b':2}, {'c':1}, {'d':3}, {'e':2}]
>>> keyfunc = lambda d: next(iter(d.values()))
>>> sorted(lst, key=keyfunc)
[{'a': 1}, {'c': 1}, {'b': 2}, {'e': 2}, {'d': 3}]
>>> {k: [x for d in g for x in d]
... for k, g in itertools.groupby(sorted(lst, key=keyfunc), key=keyfunc)}
{1: ['a', 'c'], 2: ['b', 'e'], 3: ['d']}
def get_dict(list):
res = {}
for elem in list:
k, v = elem.keys(), elem.values()
if v[0] in res:
res[v[0]].append(k[0])
else:
res[v[0]] = [k[0]]
return res
{ 1:[a,c], 2:[b, e], 3:[c] }
list = [{"a":1},{"b":2},{"c":1},{"d":3},{"e":2}]
d = {}
for i in list:
key, value = i.items()[0]
if value not in d:
d[value] = [key]
else:
d[value].append(key)
print(d)
输出:
{1: ['a', 'c'], 2: ['b', 'e'], 3: ['d']}
已在Python2.7中测试通过
dict_items
,当然next(iter())
语法是可行的。 - Chris_Rands这里有一种方法可以实现你所寻找的功能:
list_ = [{"a":1},{"b":2},{"c":1},{"d":3},{"e":2}]
values = set(value for dic in list_ for value in dic.values())
for value in values:
keys = [list(dic.keys())[0] for dic in list_ if value in dic.values()]
print("{}: {}".format(value, keys))
输出:
1: ['a', 'c']
2: ['b', 'e']
3: ['d']
defaultdict
的解决方案。from __future__ import print_function
from collections import defaultdict
lst = [{'a': 1}, {'b': 2}, {'c': 1}, {'d': 3}, {'e': 2}]
d = defaultdict(list)
for l in lst:
val, key = l.items()[0]
d[key].append(val)
print(d)
defaultdict(<type 'list'>,{1: ['a','c'],2: ['b','e'],3: ['d']})
groupby
代码吗? - Ma0list
)这样的东西命名,因为这可能会产生不良影响。现在,你可以选择“我该如何使用itertools.groupby
”的方式,或者你可以自己编写代码。无论哪种情况,你都需要更具体地描述你的问题,并展示一些努力。记住,没有人会替你完成作业。 - Ulrich Eckhardtdefaultdict
类型的问题。 - Chris_Rands