Python创建列表字典

Python creating a dictionary of lists

我想创建一个值为列表的字典。例如:

1
2
3
4
5
{
  1: ['1'],
  2: ['1','2'],
  3: ['2']
}

如果我这样做:

1
2
3
4
5
d = dict()
a = ['1', '2']
for i in a:
    for j in range(int(i), int(i) + 2):
        d[j].append(i)

我得到一个键错误,因为d[…]不是一个列表。在这种情况下,我可以在分配后添加以下代码来初始化字典。

1
2
for x in range(1, 4):
    d[x] = list()

有更好的方法吗?假设在进入第二个for循环之前,我不知道需要什么键。例如:

1
2
3
4
5
6
7
class relation:
    scope_list = list()
...
d = dict()
for relation in relation_list:
    for scope_item in relation.scope_list:
        d[scope_item].append(relation)

一个替代方案将取代

1
d[scope_item].append(relation)

具有

1
2
3
4
if d.has_key(scope_item):
    d[scope_item].append(relation)
else:
    d[scope_item] = [relation,]

最好的方法是什么?理想情况下,附加将"只起作用"。有没有什么方法可以表达我想要一个空列表的字典,即使我在第一次创建列表时不知道每个键?


您可以使用defaultdict:

1
2
3
4
5
6
7
8
9
10
>>> 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'])]


你可以用这样的列表理解来构建它:

1
2
>>> dict((i, range(int(i), int(i) + 2)) for i in ['1', '2'])
{'1': [1, 2], '2': [2, 3]}

在问题的第二部分,使用defaultdict

1
2
3
4
5
6
7
8
>>> 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

1
2
3
4
5
6
7
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是一个更好、更现代的选择。setdefault在旧版本的python(早于2.5)中仍然有用。


您的问题已经得到回答,但是IIRC可以替换如下行:

1
if d.has_key(scope_item):

用:

1
if scope_item in d:

也就是说,d在该结构中引用了d.keys()。有时,defaultdict不是最佳选择(例如,如果您想在与上述if相关联的else之后执行多行代码),我发现in语法更容易阅读。


简单的方法是:

1
2
3
4
5
6
7
a = [1,2]
d = {}
for i in a:
  d[i]=[i, ]

print(d)
{'1': [1, ], '2':[2, ]}

就我个人而言,我只是使用JSON将事物转换为字符串并返回。我能理解琴弦。

1
2
3
4
5
6
7
import json
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
mydict = {}
hash = json.dumps(s)
mydict[hash] ="whatever"
print mydict
#{'[["yellow", 1], ["blue", 2], ["yellow", 3], ["blue", 4], ["red", 1]]': 'whatever'}