在字典中解包元组

Pet*_*ren 1 python dictionary python-2.7 iterable-unpacking

为什么这个解包不适用于我的字典?

字典构建如下:

cutDict = {'scene1': [('scene3', 1001, 1125)]} 
Run Code Online (Sandbox Code Playgroud)

我想解压缩这个:

for key, (cut, fIn, fOut) in cutDict.iteritems():   
    print key 
    print cut
    print fIn
    print fOut
Run Code Online (Sandbox Code Playgroud)

但结果是:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack
Run Code Online (Sandbox Code Playgroud)

现在我正在通过以下方式构建字典:

cutDict.setdefault(itm, [])
for cutItm in itm.cut_items_ordered:
    cutInOut = (mostcutItm, recentcutItm.cut_item_in, callcutItm.cut_item_out)
    cutDict[itm].append(cutInOut): 
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

你的值不是一个元组,它是一个包含一个元素的列表,它是一个元组; 嵌套元组有3个元素.由于外部容器只有一个元素,因此解包分配失败.

如果总是只有一个元素,则通过添加另一个层可以实现以下功能:

for key, ((cut, fIn, fOUT),) in cutDict.iteritems():
Run Code Online (Sandbox Code Playgroud)

或者您可以使用列表语法:

for key, [(cut, fIn, fOUT)] in cutDict.iteritems():
Run Code Online (Sandbox Code Playgroud)

演示:

>>> cutDict = {'scene1': [('scene3', 1001, 1125)]}
>>> for key, ((cut, fIn, fOUT),) in cutDict.iteritems():
...     print key, cut, fIn, fOut
...
scene1 scene3 1001 1125
>>> for key, [(cut, fIn, fOUT)] in cutDict.iteritems():
...     print key, cut, fIn, fOut
...
scene1 scene3 1001 1125
Run Code Online (Sandbox Code Playgroud)

或者,删除嵌套,外部列表是多余的.

如果你的字典里真的可以有一个以上的在它的项目,然后外列表当然不是多余的,但你不能使用迭代拆包.你必须添加另一个循环:

for key, cuts in cutDict.iteritems():
    for cut, fIn, fOUT in cuts:
        # ...
Run Code Online (Sandbox Code Playgroud)

  • Martijn,你能说一下你为什么要在这里使用`iteritems()`,而不只是`for cut in cutDict`?我想在执行`for cut in cutDict`时,整个_for X,Y_循环不会那么简洁,因为我还必须输入`cutDict [key]`?是吗?谢谢! (2认同)
  • @patrick:就是这样.当你总是要使用这些值时,为什么只循环键? (2认同)