将元组列表转换为字典

33

我正在寻找一种将类似这样的元组列表转换的方法:

[(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)]

转换为这样的字典:

{4:[1,2,3] ,15:[4,5,9,11,12], 23:[6,7,8,10]}

每个元组的第二个元素成为一个字典键,与该键关联的所有第一个元组元素将存储在值列表中。

您能展示一下如何做到这一点吗?


1
你为什么想要一个字典列表,其中每个字典只有一个键/值对呢?你确定你不只是想要一个字典吗? - FogleBird
是的,FogleBird,你说得对。我最终是在找字典。谢谢你指出来。 - elfuego1
22
根据浏览次数,大多数人(包括我自己)来到这里是想知道如何将 myList = [(key1, val1), (key2, val2), ...] 转换为字典:{key1:val1, key2:val2...}。 要做到这一点,只需使用 dict(myList) 即可。 - mindthief
7个回答

50
>>> from collections import defaultdict
>>> l= [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)]
>>> d= defaultdict( list )
>>> for v, k in l:
...     d[k].append(v)
... 
>>> d
defaultdict(<type 'list'>, {23: [6, 7, 8, 10], 4: [1, 2, 3], 15: [4, 5, 9, 11, 12]})
>>> [ {k:d[k]} for k in sorted(d) ]
[{4: [1, 2, 3]}, {15: [4, 5, 9, 11, 12]}, {23: [6, 7, 8, 10]}]

使用defaultdict会更好,比每次调用setdefault()更顺畅。 - Evan Fosmark
1
喜欢collections.defaultdict。这是我处理许多工作的首选类。 - hughdbrown

14
>>> a = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)]
>>> b = {}
>>> for i, j in a:
...     b.setdefault(j, []).append(i)
...
>>> b
{23: [6, 7, 8, 10], 4: [1, 2, 3], 15: [4, 5, 9, 11, 12]}
>>>

太棒了!我今天刚学会了一个新的字典操作-setdefault。这将使我的代码更加整洁!干杯!+1 - Steve Folly
3
看看 collections.defaultdict,它甚至更好。 - S.Lott

2
l = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)]
d = {}
for v, k in l:
    d.setdefault(k, []).append(v)

通过复制我在您的编辑中使用的setdefault,现在选民可以选择的选项更少了... - FogleBird
2
我真的没有复制它。我意识到我也可以使用setdefault,就在发布后立即更新了我的帖子,因为我更喜欢这种方式。 - c089
没问题。编辑以添加其他想法并没有错,但通常是为了添加更多信息,而不是创建重复的答案。但我理解你没有抄袭我的。 - FogleBird

2
tuples = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)]
dicts = {}
for elem in tuples:
    try:
        dicts[elem[1]].append(elem[0])
    except KeyError:
        dicts[elem[1]] = [elem[0],]

1
在你的for循环中使用解包。在一个元素列表中不需要逗号(只有元组需要)。在Python中,在这种情况下使用异常更加可行,但仍然有点傻。 - FogleBird
2
异常并不傻 - 这是defaultdict的工作原理。但我同意关于解包的观点。 - xorsyst

2
这样就可以了:
from collections import defaultdict

def to_list_of_dicts(list_of_tuples):
    d = defaultdict(list)
    for x, y in list_of_tuples:
        d[y].append(x)
    return sorted([{x: y} for (x, y) in d.items()])

2

它并不华丽,但却非常简单。

l = [(1,4),(2,4),(3,4),(4,15),(5,15),(6,23),(7,23),(8,23),(9,15),(10,23),(11,15),(12,15)]
d = dict((k, [i[0] for i in l if i[1] == k]) for k in frozenset(j[1] for j in l))

欢呼!

0
for key, value in tuples:
    if d.get(key):
        d[key].append(value)
        continue
    d[key] =[value]

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