按值对字典列表进行分组

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 代码吗? - Ma0
不要给像内置类型(list)这样的东西命名,因为这可能会产生不良影响。现在,你可以选择“我该如何使用itertools.groupby”的方式,或者你可以自己编写代码。无论哪种情况,你都需要更具体地描述你的问题,并展示一些努力。记住,没有人会替你完成作业。 - Ulrich Eckhardt
按组分组只有在数据按相同键函数排序后才能生效,因此请先进行排序。 - tobias_k
另外,为什么你有一系列的字典,每个字典只有一个独特的键?难道你不能只用一个字典吗? - tobias_k
这感觉像是 defaultdict 类型的问题。 - Chris_Rands
5个回答

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

4
这是一种可能的解决方案,不使用任何库。
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] }

这是考虑到您始终会有相同的输入格式。如果不是,您可以调整所读取和保存的内容。

2
这可能会有所帮助。
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中测试通过


Py 3 中失败了。 - Chris_Rands
你是否遇到了错误? - Rakesh
我没有尝试过,但是你不能索引dict_items,当然next(iter())语法是可行的。 - Chris_Rands

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接