字典的元组(键,值)ValueError:字典更新序列元素#0的长度为6; 2是必需的

时间:2018-05-12 14:28:36

标签: python dictionary tuples

我有一个字符串,我正则表达式返回一个元组(见打印结果),我想从它创建一个字典(元组的第一个条目是键,第二个是值),根据StackOverflow帖子应该像魅力。 for循环可以返回多个点,每个点都应该添加到应该返回的单个dict中。

代码&错误:

import re as re

n = nuke.selectedNode()
k = n.knob('scene')
script = k.toScript().replace('\n','').split('scenegraph {')

for sgrph in script:
    for m in [re.match(r".*\bname '([Point\d]+)'.*\btransform ([0-9.e+\- ]+)",sgrph)]:
        if m is not None:
            print m.groups()
            items = dict(m.groups()) #this causes the error
            print "........."
print items

输出:

# Result: ('Point1', '1.983990908e+00 0.000000000e+00 0.000000000e+00 0.000000000e+00 0.000000000e+00 1.983990908e+00 0.000000000e+00 0.000000000e+00 0.000000000e+00 0.000000000e+00 1.983990908e+00 0.000000000e+00 5.610483289e-01 6.365304199e+03 4.553408813e+02 1.000000000e+00      ')
    Traceback (most recent call last):
      File "<string>", line 11, in <module>
    ValueError: dictionary update sequence element #0 has length 6; 2 is required

2 个答案:

答案 0 :(得分:1)

在我看来,明确一个好主意。例如,您可以在嵌套的for循环之前定义字典,显式解压缩并将字段添加到字典中。

res = {}

for sgrph in script:
    for m in [re.match(r".*\bname '([Point\d]+)'.*\btransform ([0-9.e+\- ]+)",sgrph)]:
        if m is not None:
            key, value = m.groups()
            res[key] = value

答案 1 :(得分:0)

python中的Dict可以从(key, value)对的迭代中创建。但是,由于m.groups()调用,您有一个平坦的值元组。你需要选择这个元组的偶数元素作为键,然后选择奇数元素作为相应的值,然后zip将它们组合在一起:

values = ('foo', 'bar', 'qux', 'blah')
dict(zip(values[::2], values[1::2]))

以下是使用re.match().groups()的示例:

import re
match = re.match(r'(\d+) (\d+) (\d+) (\d+)', '12 34 56 78')
groups = match.groups()               # gives ('12', '34', '56', '78')
dict(zip(groups[::2], groups[1::2]))  # gives {'56': '78', '12': '34'}

UPD:请注意zip生成的序列长度被截断为其输入的最短长度。因此,如果m.groups()返回奇数个元素,则结果字典中不会出现最后一个值。