Как я могу сделать выражение генератора одной строки для создания этих двух разных списков

Я пишу программу, которая анализирует такие списки.

['ecl:gry', 'pid:860033327', 'eyr:2020', 'hcl:#fffffd', 'byr:1937', 'iyr:2017', 'cid:147', 'hgt:183cm']

Я хочу превратить этот список в словарь пар ключ-значение, что я и сделал здесь:

keys = []
values = []

for string in data:
    pair = string.split(':')
    keys.append(pair[0])
    values.append(pair[1])

zipped = zip(keys, values)
self.dic = dict(zipped)
print(self.dic)

Я знаю, что могу использовать понимание списков, чтобы составить один из списков в такое время

keys = [s.split(':')[0] for s in data]
values = [s.split(':')[1] for s in data]

Для этого требуется два цикла, поэтому первый пример кода будет лучше, но есть ли способ сгенерировать оба списка с помощью одного генератора с распаковкой, а затем сжать их вместе?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
64
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете легко понять это:

your_dict = {x.split(':')[0]: x.split(':')[1] for x in data}

Вы также можете предотвратить использование разделения два раза и использовать генератор:

your_dict = dict(x.split(':') for x in data)

Что кажется даже чище...

Ничего себе, я даже не думал, что есть понимание словаря, это потрясающе. Питон прекрасен. Спасибо!

Zixxle 12.12.2020 21:41

Это была моя первая идея, но использование split дважды показалось мне… неуклюжим.

Matthias 12.12.2020 21:44

Я сделал это так:

self.dic = {}
for e in data:
    k, v = e.split(':')
    self.dic[k] = v
Ответ принят как подходящий
l = ['ecl:gry', 'pid:860033327', 'eyr:2020', 'hcl:#fffffd',
     'byr:1937', 'iyr:2017', 'cid:147', 'hgt:183cm']

dict(e.split(':') for e in l)

Вам даже не нужен список: dict(e.split(':') for e in l)

Matthias 12.12.2020 21:42

Еще меньше символов в ответе. Спасибо вам, ребята

Turtlean 12.12.2020 21:43

Меньше символов не означает, что он будет работать быстрее. Но в этом случае это будет быстрее, потому что split нужно делать только один раз для каждой строки.

Matthias 12.12.2020 21:46

@Matthias Я думаю, что меньшее количество символов обычно означает, что он будет работать быстрее. В этом случае он не будет создавать временный список и передавать генератор напрямую dict, что делает его немного быстрее.

Asocia 12.12.2020 21:49

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

Matthias 12.12.2020 22:00

@Matthias В дополнение к тому, что вы сказали; даже если что-то меньше символов, это не значит, что оно лучше, потому что читабельность имеет значение :)

Asocia 12.12.2020 22:04

Другие вопросы по теме