Учитывая следующие примеры данных:
values=['A 1','B 2','C 3']
Я хочу создать словарь, где A сопоставляется с 1, B до 2 и от C до 3. Следующие работы, но есть повторение:
my_dict={value.split()[0]:value.split()[1] for value in values}
Повторение value.split()
выглядит уродливым. Есть ли способ более элегантно создать словарь без повторения value.split()
?
Два способа, о которых я могу думать:
>>> {k:v for k,v in (s.split() for s in values)}
{'A': '1', 'B': '2', 'C': '3'}
>>> dict(s.split() for s in values)
{'A': '1', 'B': '2', 'C': '3'}
Я предлагаю прочитать о типе dict
: https://docs.python.org/3/library/stdtypes.html#mapping-types-dict; особенно:
Каждый элемент в iterable должен быть итерабельным с ровно двумя объектами. Первым объектом каждого элемента становится ключ в новом словаре, а второй объект - соответствующее значение.
а также введение диктов в PEP 274:
Семантика понятий dict может быть фактически продемонстрирована на складе Python 2.2, передавая представление списка встроенному конструктору словаря:
>>> dict([(i, chr(65+i)) for i in range(4)])
семантически эквивалентно:
>>> {i : chr(65+i) for i in range(4)}
s.split() for s in values
вокруг s.split() for s in values
- вот что меня достало, спасибо!
k:v for k,v
выглядит для меня как анти-шаблон, похожий на [x for x in iterable]
.
Для функционального решения вы можете использовать dict
с map
и str.split
:
values = ['A 1', 'B 2', 'C 3']
res = dict(map(str.split, values))
{'A': '1', 'B': '2', 'C': '3'}
вы можете сделать так: pythonic:
>>> values =['A 1','B 2','C 3']
>>> dict(map(str.split, values))
{'A': '1', 'C': '3', 'B': '2'}
Верните список слов в строке, используя sep в качестве строки разделителя. Если задано maxsplit, выполняется максимум maxsplit (таким образом, список будет иметь максимум maxsplit + 1 элемент). Если maxsplit не указан или -1, то нет ограничений на количество разделов (все возможные расщепления сделаны). Если указано sep, последовательные разделители не группируются вместе и считаются разграниченными пустыми строками (например, '1, 2'.split(', ') возвращает [' 1 ',' ',' 2 ']). Аргумент sep может состоять из нескольких символов (например, '1 <> 2 <> 3'.split(' <> ') возвращает [' 1 ',' 2 ',' 3 ']). Разделение пустой строки с указанным разделителем возвращает [''].
Примените функцию к каждому элементу итерации и верните список результатов. Если передаются дополнительные повторяющиеся аргументы, функция должна принимать много аргументов и применяется к элементам из всех итераций параллельно. Если один итерабельность короче другого, предполагается, что он расширен с помощью элементов "Нет". Если функция None, предполагается функция идентификации; Если существует несколько аргументов, map() возвращает список, состоящий из кортежей, содержащих соответствующие элементы, из всех итераций (своего рода операция транспонирования). Итерируемыми аргументами могут быть последовательность или любой итерируемый объект; результат всегда является списком.
вы можете видеть, что словарь не упорядочен как ваш список. Используя collections.orderedDict, мы можем сохранить порядок введенного ввода.
>>> import collections
>>> values =['A 1','B 2','C 3']
>>> my_ordered_dict = collections.OrderedDict(map(str.split, values))
>>> my_ordered_dict
OrderedDict([('A', '1'), ('B', '2'), ('C', '3')])
dict(v.split() for v in values)
dict()
может принимать список пар, таких как[('A', '1'), ('B', '2')]