我有一个值列表和一个字典词典。他们看起来像这样:
d = {1 : {1 : '', 2 : '', 3 : ''},2 : {1 : '', 2 : '', 3 : ''}}
l = ['Erich Martin', 'Zia Michael', 'Olga Williams', 'Uma Gates']
我正在尝试将列表中的值映射到字典中,填充每个字典,然后再转到下一个嵌套字典。最后一本字典会有一些空插槽,这很好。我似乎无法绕过我需要做的事情;我跑到列表的末尾并得到一个keyerror,因为没有更多的值。这是我到目前为止所得到的要点:
for g,s in d.items():
for i in s:
s[i] = l.pop()
使用Python 3.4。
谢谢!
答案 0 :(得分:1)
试试这个:
根据ikaros45的评论编辑
for g,s in d.items():
for i in s:
if not l:
break
s[i] = l.pop()
这将产生:
{1: {1: 'Uma Gates', 2: 'Olga Williams', 3: 'Zia Michael'}, 2: {1: 'Erich Martin', 2: '', 3: ''}}
答案 1 :(得分:0)
您在迭代它时修改字典。首先修复:
for g,s in d.items():
for i in list(s):
s[i] = l.pop()
您还需要在列表为空时停止:
try:
for g,s in d.items():
for i in list(s):
s[i] = l.pop()
except IndexError:
pass
else:
if l:
# There weren't enough slots, handle it or raise an exception
答案 2 :(得分:0)
我假设您要将名称放入dict值,替换空字符串。在这种情况下,我会抛弃你的初始词典,并这样做:
from itertools import count
def generate(lst):
target = {}
for index in count(1):
target[index] = {}
for subindex in xrange(1, 4):
target[index][subindex] = lst.pop()
if not lst:
return target
generate(['Erich Martin', 'Zia Michael', 'Olga Williams', 'Uma Gates'])
或更优雅
from itertools import izip_longest
def generate(lst):
groups = izip_longest(fillvalue='', *([iter(lst)] * 3))
dictgroups = [dict(enumerate(group, 1)) for group in groups]
return dict(enumerate(dictgroups, 1))
generate(['Erich Martin', 'Zia Michael', 'Olga Williams', 'Uma Gates'])
两种解决方案都适用于任何输入列表,对长度没有限制,就像改变现有dict的方法一样。
答案 3 :(得分:0)
一种不同的方法,以便处理dict
固有的未分类性质。此外,从列表中弹出似乎以相反的顺序给出值并销毁原始列表(如果你没有进一步使用它可能没问题),所以我使用iter
根据需要迭代列表
d = {1 : {1 : '', 2 : '', 3 : ''},2 : {1 : '', 2 : '', 3 : ''}}
l = ['Erich Martin', 'Zia Michael', 'Olga Williams', 'Uma Gates']
i = iter(l)
for outer in sorted(d.keys()):
for inner in sorted(d[outer].keys()):
try:
d[outer][inner]=next(i)
except StopIteration:
break