我有一个字符串,我正则表达式返回一个元组(见打印结果),我想从它创建一个字典(元组的第一个条目是键,第二个是值),根据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
答案 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()
返回奇数个元素,则结果字典中不会出现最后一个值。