如何将列表中的值映射到Python中的嵌套字典?

时间:2014-11-06 20:12:10

标签: python list dictionary

我有一个值列表和一个字典词典。他们看起来像这样:

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。

谢谢!

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