Python创build一个列表字典
我想创build一个值为列表的字典。 例如:
{ 1: ['1'], 2: ['1','2'], 3: ['2'] }
如果我做:
d = dict() a = ['1', '2'] for i in a: for j in range(int(i), int(i) + 2): d[j].append(i)
我得到一个KeyError,因为d […]不是一个列表。 在这种情况下,我可以在赋值后添加下面的代码来初始化字典。
for x in range(1, 4): d[x] = list()
有没有更好的方法来做到这一点? 可以说,我不知道我将需要的钥匙,直到我在第二个循环。 例如:
class relation: scope_list = list() ... d = dict() for relation in relation_list: for scope_item in relation.scope_list: d[scope_item].append(relation)
替代scheme将被替代
d[scope_item].append(relation)
同
if d.has_key(scope_item): d[scope_item].append(relation) else: d[scope_item] = [relation,]
处理这个问题的最好方法是什么? 理想情况下,追加将“只是工作”。 有什么方法来expression我想要一个空列表的字典,即使我不知道每一个关键时,我第一次创build列表?
你可以使用defaultdict :
>>> from collections import defaultdict >>> d = defaultdict(list) >>> for i in a: ... for j in range(int(i), int(i) + 2): ... d[j].append(i) ... >>> d defaultdict(<type 'list'>, {1: ['1'], 2: ['1', '2'], 3: ['2']}) >>> d.items() [(1, ['1']), (2, ['1', '2']), (3, ['2'])]
你可以用像这样的列表理解来build立它:
>>> dict((i, range(int(i), int(i) + 2)) for i in ['1', '2']) {'1': [1, 2], '2': [2, 3]}
对于问题的第二部分,使用defaultdict
>>> from collections import defaultdict >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] >>> d = defaultdict(list) >>> for k, v in s: d[k].append(v) >>> d.items() [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
使用setdefault
:
d = dict() a = ['1', '2'] for i in a: for j in range(int(i), int(i) + 2): d.setdefault(j, []).append(i) print d # prints {1: ['1'], 2: ['1', '2'], 3: ['2']}
相当奇怪的setdefault
函数说:“使用这个键获取值,或者如果该键不存在,请添加此值然后返回”。
编辑 :正如其他人正确指出, defaultdict
是一个更好,更现代的select。 在老版本的Python中(2.5之前), setdefault
仍然有用。
你的问题已经被回答了,但是IIRC你可以replace如下的行:
if d.has_key(scope_item):
有:
if scope_item in d:
也就是说, d
在该构造中引用了d.keys()
。 有时候defaultdict
不是最好的select(例如,如果你想在与上面的if
关联的else
之后执行多行代码),并且我发现in
语法上更容易阅读。