Python 在字典中解包元组

Python 在字典中解包元组,python,python-2.7,dictionary,iterable-unpacking,Python,Python 2.7,Dictionary,Iterable Unpacking,为什么我的字典不需要拆包呢 字典的构建如下所示: cutDict = {'scene1': [('scene3', 1001, 1125)]} 我试着像这样打开包装: for key, (cut, fIn, fOut) in cutDict.iteritems(): print key print cut print fIn print fOut 但这导致: Traceback (most recent call last): File "<

为什么我的字典不需要拆包呢

字典的构建如下所示:

cutDict = {'scene1': [('scene3', 1001, 1125)]} 
我试着像这样打开包装:

for key, (cut, fIn, fOut) in cutDict.iteritems():   
    print key 
    print cut
    print fIn
    print fOut
但这导致:

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

您的值不是一个元组,它是一个包含一个元素的列表,这是一个元组;嵌套的元组有3个元素。因为外部容器只有一个元素,所以解包分配失败

如果始终只有一个元素,则通过添加另一层,以下操作确实有效:

也可以使用列表语法:

for key, [(cut, fIn, fOUT)] in cutDict.iteritems():
演示:

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

如果你的字典中真的可以有多个条目,那么外部列表当然不是多余的,但是你也不能使用iterable解包。您必须添加另一个循环:

for key, cuts in cutDict.iteritems():
    for cut, fIn, fOUT in cuts:
        # ...

您的值不是一个元组,它是一个包含一个元素的列表,这是一个元组;嵌套的元组有3个元素。因为外部容器只有一个元素,所以解包分配失败

如果始终只有一个元素,则通过添加另一层,以下操作确实有效:

也可以使用列表语法:

for key, [(cut, fIn, fOUT)] in cutDict.iteritems():
演示:

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

如果你的字典中真的可以有多个条目,那么外部列表当然不是多余的,但是你也不能使用iterable解包。您必须添加另一个循环:

for key, cuts in cutDict.iteritems():
    for cut, fIn, fOUT in cuts:
        # ...


@PetterÖstergren:是的,这样就彻底解决了问题。Martijn,你能说说为什么你会在这里使用iteritems,而不仅仅是在cutDict中使用key吗?我想当在cutDict中为key执行操作时,整个for X,Y循环不会像在cutDict[key]中执行操作那样简洁?是这样吗?谢谢@帕特里克:就是这样。为什么总是要使用值时才循环使用键呢?我没有意识到Python解包足够聪明,可以用这种方式嵌套解包。无论我在这门语言上工作了多长时间,我都能从Martijn的答案中学到一些东西。@PetterÖstergren:是的,这样就彻底解决了这个问题。Martijn,你能说说为什么你会在这里使用iteritems,而不仅仅是为了输入cutDict吗?我想当在cutDict中为key执行操作时,整个for X,Y循环不会像在cutDict[key]中执行操作那样简洁?是这样吗?谢谢@帕特里克:就是这样。为什么总是要使用值时才循环使用键呢?我没有意识到Python解包足够聪明,可以用这种方式嵌套解包。无论我在这门语言上工作了多长时间,我都能从Martijn的答案中学到一些东西。@MartijnPiets我只是把目录从我的终端上复制了下来。结果是这样的:[,10011125]@MartijnPieters不幸的是,我不知道为什么它同时添加了[],我只是构建了一个由其他变量填充的变量,总共3个,并附加到dict中。然后你仍然有一个列表,包含1个元素,一个元组。请在你的问题中加入这一点,并添加你得到的异常的完整回溯。你不需要自我。参考这里,如果你放弃了它,它将使复制更容易。这些对象也有点让人分心。我们无法告诉您如何解决嵌套问题,因为您没有分享如何构建字典。这也是一个单独的问题。从您的编辑可以清楚地看到,您的列表中可能有0个或多个cutInOut结构,此时您的解包操作不再可行。查看我的更新答案。@MartijnPieters我刚刚从终端复制了目录。结果是这样的:[,10011125]@MartijnPieters不幸的是,我不知道为什么它同时添加了[],我只是构建了一个由其他变量填充的变量,总共3个,并附加到dict中。然后你仍然有一个列表,包含1个元素,一个元组。请在你的问题中加入这一点,并添加你得到的异常的完整回溯。你不需要自我。参考这里,如果你放弃了它,它将使复制更容易。这些对象也有点让人分心。我们无法告诉您如何解决嵌套问题,因为您没有分享如何构建字典。这也是一个单独的问题。从您的编辑可以清楚地看到,您的列表中可能有0个或多个cutInOut结构,此时您的解包操作不再可行。请参阅我的最新答案。
for key, cuts in cutDict.iteritems():
    for cut, fIn, fOUT in cuts:
        # ...