Как я могу сопоставить списки, чтобы продиктовать ключ как значение - PullRequest
0 голосов
/ 10 мая 2019

У меня есть объект итератора, тогда, когда итерация имеет атрибуты каждого элемента, из которых интересуются время и значение

[(point.time, point.value) for point in control_points]
[(Fraction(-1, 23), Fraction(0, 1)), (Fraction(24, 23), Fraction(100, 1))]

и время и значение Fraction объект

сейчасЯ должен построить структуру данных, отображаемую таким образом, чтобы первый кортеж был с in_time dict, а второй - с out_time dict

({'in_time': "" , 'in_value': ""} , {'out_time': "", 'out_value': ""})

Я также пытался по-другому, используя список, например:

container = [['in_time', 'in_value'] , ['out_time', 'out_value']]

dict(zip([objects for objects in container, [(point.time, point.value) for point in contol_points]]))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 1; 2 is required

Я надеялся, что что-то подобное будет возможно: https://stackoverflow.com/a/33737067/9567948

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Вот моя попытка:

Я использую * итератор в zip для доступа к обоим спискам, но порядок неправильный, поэтому мне нужно повторить цикл, чтобы изменить порядок.

from fractions import Fraction
container = [['in_time', 'in_value'] , ['out_time', 'out_value']]
control_points = [(Fraction(-1, 23), Fraction(0, 1)), (Fraction(24, 23), Fraction(100, 1))]

zipped_list = list(zip(*container,*control_points))
new_dict={}
i=0
for element in zipped_list:

    while((i+3)<=len(element)):
        print([element[i]], element[i+2])
        new_dict[element[i]]=element[i+2]
        i+=1
    i=0

print(new_dict)

Выход: enter image description here

Для Python 2:

from fractions import Fraction
container = [['in_time', 'in_value'] , ['out_time', 'out_value']]
control_points = [(Fraction(-1, 23), Fraction(0, 1)), (Fraction(24, 23), Fraction(100, 1))]


zipped_list = dict(zip([element for x in container for element in x],[element for y in control_points for element in y]))
print(zipped_list)

Выход: enter image description here

0 голосов
/ 10 мая 2019

Игнорирование дробей и использование целых для отображения одного подхода:

Учитывая

control_points = [point(-1, 0), point(24, 100)]
container = [['in_time', 'in_value'] , ['out_time', 'out_value']]

Уведомление

{ container[0][0]:control_points[0].time, container[0][1] : control_points[0].value }

дает

{'in_time': -1, 'in_value': 0}

ТакПоднял первый предмет.Если вы перечислите container следующим образом:

[{ c[0]:control_points[i].time, c[1] : control_points[i].value } for i,c in enumerate(container)]

Вы получите это:

[{'in_time': -1, 'in_value': 0}, {'out_time': 24, 'out_value': 100}]

Это кажется чрезмерным для двух пунктов, но показывает, как выполнять словарные вычисленияи перечислять.

...