У меня есть список ключевых:
list_date = ["MON", "TUE", "WED", "THU","FRI"]
У меня есть много списков значений, созданных с помощью приведенных ниже кодов:
list_value = list()
for i in list(range(5, 70, 14)):
list_value.append(list(range(i, i+10, 3)))
Правила создали то, что:
первое число 5, список из 4 элементов имеет значение x = x + 3 и т. д. [5, 8, 11, 14]
первое число второго списка равно: x = 5 + 14, а значение внутри по-прежнему, как указано выше x = x +3
[[5, 8, 11, 14], [19, 22, 25, 28], [33, 36, 39, 42], [47, 50, 53, 56], [61, 64, 67, 70]]
Я ожидаю получить такой диктат:
collections = {"MON":[5, 8, 11, 14], "TUE" :[19, 22, 25, 28], "WED":[33, 36, 39, 42], "THU":[47, 50, 53, 56], "FRI":[61, 64, 67, 70]}
Затем я использовал:
zip_iterator = zip(list_date, list_value)
collections = dict(zip_iterator)
Чтобы получить ожидаемый результат.
Я попробовал другой способ, например, с помощью lambda функция.
for i in list(range(5, 70, 14)):
list_value.append(list(range(i,i+10,3)))
couple_start_end[lambda x: x in list_date] = list(range(i, i + 10, 3))
И результат:
{<function <lambda> at 0x000001BF7F0711F0>: [5, 8, 11, 14], <function <lambda> at 0x000001BF7F071310>: [19, 22, 25, 28], <function <lambda> at 0x000001BF7F071280>: [33, 36, 39, 42], <function <lambda> at 0x000001BF7F0710D0>: [47, 50, 53, 56], <function <lambda> at 0x000001BF7F0890D0>: [61, 64, 67, 70]}
Я хочу спросить, есть ли лучшее решение для создания списков значений с указанными выше правилами? и создать словарь collections без использования zip метод?
2 ответа
Один из альтернативных подходов — воспользоваться enumerate() — что позволяет вам перебирать то, что можно рассматривать как zip() индексов и значений списка. На мой взгляд, эта версия кажется немного понятнее и проще.
days = ['MON', 'TUE', 'WED', 'THU', 'FRI']
d = {
day : [
(5 + i * 14) + (j * 3)
for j in range(4)
]
for i, day in enumerate(days)
}
print(d)
Другой способ, который, как и FMc, имеет то преимущество, что вам не нужно рассчитывать / указывать пределы диапазона (ваш 70 а также i+10):
from itertools import count, islice
days = ['MON', 'TUE', 'WED', 'THU', 'FRI']
d = {day: list(islice(count(start, 3), 4))
for day, start in zip(days, count(5, 14))}
print(d)

Лично я всегда использую
itertools.productвсякий раз, когда задействовано декартово произведение:d = {day: (5 + i * 14) + (j * 3) for i,(j,day) in it.product(range(4), enumerate(days))}.— Кевин
Только заметил, что ответы не совпадают. Я отказываюсь от своего заявления.
— Кевин
@Kevin: извините! но что такое «оно» в «it.product ()»
— Скорпионы
@ Скорпионы
import itertools as it. Ноproduct()здесь не особо помогает.— FMc
Также не нужно писать
3*jвообще — вместо этого вы можете переместить это вj in range(0, 12, 3)чтобы избежать умножения.— Райндериен
Показывать 3 больше комментариев