2014-11-06 103 views
1

我有一个值列表和字典的词典。他们是这个样子:如何将列表中的值映射到Python中的嵌套字典?

d = {1 : {1 : '', 2 : '', 3 : ''},2 : {1 : '', 2 : '', 3 : ''}} 
l = ['Erich Martin', 'Zia Michael', 'Olga Williams', 'Uma Gates'] 

我想从列表中值映射到字典,就移动到下一个嵌套的字典之前填充每个字典。最后的字典会有一些空的插槽,这很好。我似乎无法将我的头围绕在我需要做的事情上;由于没有更多的价值,我遇到了列表的末尾,并得到了一个关键错误。这里是我到目前为止的要点:

for g,s in d.items(): 
     for i in s: 
       s[i] = l.pop() 

使用Python 3.4。

谢谢!

+1

它是如何将列表中的值映射到字典?你能提供一个你想得到什么的例子吗? – bgusach 2014-11-06 20:16:12

+1

它看起来像你真的想砍你的名字列表。你可以试试这个:[l [i:i + 3]我在范围内(0,len(l),3)]。这将创建一个列表,每次分组的项目为3。 – vikramls 2014-11-06 20:19:49

+0

你知道,那个字典没有订单。 – Daniel 2014-11-06 20:21:00

回答

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: ''}} 
+0

这样做;我曾尝试过一些len(l)> 0:没有成功。这更有意义,更清洁。 – lorsungcu 2014-11-06 20:41:43

+1

在Python中,不需要检查列表的长度。只要做'如果不是l:打破' – bgusach 2014-11-06 20:54:20

+0

你是对的,@ ikaros45。我已经用你的建议更新了我的答案。 – 2014-11-06 21:11:59

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 
0

我假设你想把名字写入字典值,替换空字符串。在这种情况下,我会倾倒您最初的字典,这样来做:

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

两种解决方案都将与任何输入列表的工作,对长度没有限制,你将有用改变现有字典的方法。

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