Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中将值从列表映射到嵌套字典?_Python_List_Dictionary - Fatal编程技术网

如何在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