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语法上更容易阅读。