有效的方式创建列表或向已有列表追加?

67 投票
8 回答
65635 浏览
提问于 2025-04-15 17:56

我正在处理一堆有很多对多关系的元组,我想创建一个字典,让每个(b)都有一个对应的(a)列表。每次在处理元组的时候,我都要先检查字典里这个(b)是否有列表,然后再找(a),如果没有就加上去,这样做感觉很麻烦。但我还没找到更好的办法。有没有更简单好看的方法呢?

8 个回答

5

使用 collections.defaultdict

your_dict = defaultdict(list)
for (a,b) in your_list:
    your_dict[b].append(a)
21

假设你不一定要使用列表,defaultdictset 这两个东西非常好用。

import collections
d = collections.defaultdict(set)
for a, b in mappings:
    d[b].add(a)

如果你真的想用列表而不是集合,你可以接着这样做:

for k, v in d.iteritems():
    d[k] = list(v)

而如果你真的想用字典而不是defaultdict,你可以这样写:

d = dict(d)

不过我其实看不出你为什么会想这样做。

93

查看文档了解setdefault()方法:

setdefault(key[, default])
如果字典中有这个key,就返回它的值。
如果没有,就用default的值插入这个key,并返回default。默认情况下,default是None。

你可以用这个方法一次性获取b的值,如果b存在就返回它的值,如果不存在就把b设置为空列表,并返回这个空列表:

>>> key = 'b'
>>> val = 'a'
>>> print d
{}
>>> d.setdefault(key, []).append(val)
>>> print d
{'b': ['a']}
>>> d.setdefault(key, []).append('zee')
>>> print d
{'b': ['a', 'zee']}

把这个和简单的“not in”检查结合起来,你就能在三行代码内完成你想要的操作:

>>> b = d.setdefault('b', [])
>>> if val not in b:
...   b.append(val)
... 
>>> print d
{'b': ['a', 'zee', 'c']}

撰写回答