Создайте словарь из списка ключей и множественного списка значений в Python

У меня есть список ключевых:

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 ответа
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)

  • Лично я всегда использую 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


  • 1

    Также не нужно писать 3*j вообще — вместо этого вы можете переместить это в j in range(0, 12, 3) чтобы избежать умножения.

    — Райндериен

Другой способ, который, как и 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)

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *