Python创建列表字典


214

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

{
  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 [...]不是列表。在这种情况下,我可以在分配a后添加以下代码以初始化字典。

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

有一个更好的方法吗?可以说,直到进入第二个for循环,我才知道需要的键。例如:

class relation:
    scope_list = list()
...
d = dict()
for relation in relation_list:
    for scope_item in relation.scope_list:
        d[scope_item].append(relation)

然后可以替代

d[scope_item].append(relation)

if d.has_key(scope_item):
    d[scope_item].append(relation)
else:
    d[scope_item] = [relation,]

处理此问题的最佳方法是什么?理想情况下,追加将“有效”。有什么方法可以表达我想要空列表的字典,即使我第一次创建列表时也不知道每个键?

Answers:


278

您可以使用defaultdict

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> a = ['1', '2']
>>> 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
collections例如,模块下的其他字典也可以这种方式工作collections.OrderedDict
txsaw1 2015年

2
哦。这很棒。而且您不必初始化为'= []'。好东西!
Wilmer E. Henao

1
NameError: name 'a' is not defined
安德鲁S

51

您可以使用列表理解来构建它,如下所示:

>>> 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])]

32

您可以使用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是一个更好,更现代的选择。 setdefault在旧版本的Python(2.5之前的版本)中仍然有用。


2
这可行,但是通常首选使用defaultdict。
David Z

@David,是的,setdefault并不是最出色的设计,对不起-这几乎不是最佳选择。我确实认为我们(Python提交者)通过collections.defaultdict赎回了我们的集体声誉;-)。
亚历克斯·马丁里

@DavidZ,setdefault与defaultdict不同,因为它更灵活:另外,如何为不同的字典键指定不同的默认值?
Alex Gidan '16

@AlexGidan是的,但是与这个问题并不特别相关。
David Z

当您需要OrderedDict和默认值时,此答案也很有用。
nimcap

2

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

if d.has_key(scope_item):

与:

if scope_item in d:

也就是说,该构造中的d参考d.keys()。有时defaultdict并不是最好的选择(例如,如果您想在else与上面的内容关联后执行多行代码if),并且我发现in语法更易于阅读。


2

就个人而言,我只是使用JSON将内容转换为字符串然后返回。我了解的字符串。

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'}

1

简单的方法是:

a = [1,2]
d = {}
for i in a:
  d[i]=[i, ]

print(d)
{'1': [1, ], '2':[2, ]}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.