有效的方式创建列表或向已有列表追加?
我正在处理一堆有很多对多关系的元组,我想创建一个字典,让每个(b)都有一个对应的(a)列表。每次在处理元组的时候,我都要先检查字典里这个(b)是否有列表,然后再找(a),如果没有就加上去,这样做感觉很麻烦。但我还没找到更好的办法。有没有更简单好看的方法呢?
8 个回答
5
使用 collections.defaultdict
your_dict = defaultdict(list)
for (a,b) in your_list:
your_dict[b].append(a)
21
假设你不一定要使用列表,defaultdict 和 set 这两个东西非常好用。
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']}