按值列出的词典列表

时间:2018-03-09 09:35:24

标签: python

我有一个词典列表。我如何通过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。

你能帮助我实现这个目标吗?

5 个答案:

答案 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] }

这是考虑到你总是会有与输入格式相同的格式。如果没有,您可以调整读取和保存的内容。