Я пишу программу, которая анализирует такие списки.
['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]
Для этого требуется два цикла, поэтому первый пример кода будет лучше, но есть ли способ сгенерировать оба списка с помощью одного генератора с распаковкой, а затем сжать их вместе?
Вы можете легко понять это:
your_dict = {x.split(':')[0]: x.split(':')[1] for x in data}
Вы также можете предотвратить использование разделения два раза и использовать генератор:
your_dict = dict(x.split(':') for x in data)
Что кажется даже чище...
Это была моя первая идея, но использование split
дважды показалось мне… неуклюжим.
Я сделал это так:
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)
Еще меньше символов в ответе. Спасибо вам, ребята
Меньше символов не означает, что он будет работать быстрее. Но в этом случае это будет быстрее, потому что split
нужно делать только один раз для каждой строки.
@Matthias Я думаю, что меньшее количество символов обычно означает, что он будет работать быстрее. В этом случае он не будет создавать временный список и передавать генератор напрямую dict
, что делает его немного быстрее.
Мой комментарий был не об этом решении. Часто люди пытаются втиснуть все в как можно меньше строк, потому что думают, что меньше кода означает более быстрое поведение во время выполнения. А вот тут я бы действительно замерил разницу во времени между списком и генератором. Я видел случаи, когда скорость была выше при промежуточном построении списка. Я могу попытаться найти пример.
@Matthias В дополнение к тому, что вы сказали; даже если что-то меньше символов, это не значит, что оно лучше, потому что читабельность имеет значение :)
Ничего себе, я даже не думал, что есть понимание словаря, это потрясающе. Питон прекрасен. Спасибо!