Кортеж (ключ, значение) для словаря ValueError: элемент последовательности обновления словаря # 0 имеет длину 6;2 требуется - PullRequest
0 голосов
/ 12 мая 2018

У меня есть строка, которую я регулярно проверяю, которая возвращает мне кортеж (см. Распечатанные результаты), и я хочу создать из него словарь (первая запись кортежа - это ключ, вторая - значение), которая, согласно сообщениям StackOverflow, должна работать следующим образомШарм.Цикл for может возвращать несколько точек, каждая из которых должна быть добавлена ​​к одному и тому же возвращаемому дикту.

Код и ошибка:

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 голосов
/ 12 мая 2018

На мой взгляд, это хорошая идея, чтобы быть явным. Например, вы можете определить свой словарь до того, как вложенные циклы 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
0 голосов
/ 12 мая 2018

Dict в python может быть создан из повторяющихся пар (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() вернуло нечетное количество элементов, последнее значение не будет получено в результирующем диктате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...