我有一个词典列表。我如何通过valaues对该列表进行分组。
list = [{a:1},{b:2},{c:1},{d:3},{e:2}]
现在我的结果应该如下
1:a,c
2:b,e
3:d
我尝试使用groupby
中的itertools
。但我无法获得所需的结果。我使用的是python 2.7。
你能帮助我实现这个目标吗?
答案 0 :(得分:0)
这可能会有所帮助。
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中测试
答案 1 :(得分:0)
如果您要使用groupby
,则列表必须为sorted
与您要分组的相同键。
>>> 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']}
答案 2 :(得分:0)
这是一种做你想要的方法:
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']
答案 3 :(得分:0)
这是一个使用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']})
答案 4 :(得分:0)
这是一个不使用任何库的可能解决方案。
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] }
这是考虑到你总是会有与输入格式相同的格式。如果没有,您可以调整读取和保存的内容。