如何在Python中将值从列表映射到嵌套字典?
我有一个值列表和一本字典。它们看起来像这样:如何在Python中将值从列表映射到嵌套字典?,python,list,dictionary,Python,List,Dictionary,我有一个值列表和一本字典。它们看起来像这样: d = {1 : {1 : '', 2 : '', 3 : ''},2 : {1 : '', 2 : '', 3 : ''}} l = ['Erich Martin', 'Zia Michael', 'Olga Williams', 'Uma Gates'] 我试图将列表中的值映射到字典中,在进入下一个嵌套字典之前填充每个字典。最后一本字典会有一些空槽,没关系。我似乎不知道我需要做什么;我跑到列表的末尾,得到一个keyrerror,因为没有更多的值
d = {1 : {1 : '', 2 : '', 3 : ''},2 : {1 : '', 2 : '', 3 : ''}}
l = ['Erich Martin', 'Zia Michael', 'Olga Williams', 'Uma Gates']
我试图将列表中的值映射到字典中,在进入下一个嵌套字典之前填充每个字典。最后一本字典会有一些空槽,没关系。我似乎不知道我需要做什么;我跑到列表的末尾,得到一个keyrerror,因为没有更多的值了。以下是我目前掌握的要点:
for g,s in d.items():
for i in s:
s[i] = l.pop()
使用Python 3.4
谢谢 您在迭代字典时正在修改它。首先解决这个问题:
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
试试这个:
根据ikaros45的评论进行编辑
这将产生:
{1: {1: 'Uma Gates', 2: 'Olga Williams', 3: 'Zia Michael'}, 2: {1: 'Erich Martin', 2: '', 3: ''}}
我假设您希望将名称放入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的方法一样。一种不同的方法,以处理
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
将列表中的值映射到dict中意味着什么?你能举个例子说明你想得到什么吗?看起来你真的很想把你的名单切碎。对于(0,len(l),3)范围内的i,可以尝试以下方法:[l[i:i+3]。这将创建一个一次包含3个项目的列表;当len(l)>0:时,我尝试了一些,但没有成功。在python中,不需要检查列表的长度。只要做如果不是l:break
你是对的,@ikaros45。我已经用你的建议更新了我的答案。
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