Каков наилучший способ сохранить результаты str.split () в словарь как часть понимания списка? [Дубликат]

1

Учитывая следующие примеры данных:

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()?

  • 3
    dict(v.split() for v in values)
  • 0
    Как говорит @ Aran-Fey, конструктор dict() может принимать список пар, таких как [('A', '1'), ('B', '2')]
Теги:
python-3.x
python-3.7
dictionary

3 ответа

4
Лучший ответ

Два способа, о которых я могу думать:

>>> {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)}
  • 0
    Отсутствие s.split() for s in values вокруг s.split() for s in values - вот что меня достало, спасибо!
  • 0
    Я предпочитаю вариант 2. k:v for k,v выглядит для меня как анти-шаблон, похожий на [x for x in iterable] .
Показать ещё 1 комментарий
4

Для функционального решения вы можете использовать dict с map и str.split:

values = ['A 1', 'B 2', 'C 3']

res = dict(map(str.split, values))

{'A': '1', 'B': '2', 'C': '3'}
2

вы можете сделать так: pythonic:

>>> values =['A 1','B 2','C 3']
>>> dict(map(str.split, values))
{'A': '1', 'C': '3', 'B': '2'}

str.split([sep [, maxsplit]])

Верните список слов в строке, используя sep в качестве строки разделителя. Если задано maxsplit, выполняется максимум maxsplit (таким образом, список будет иметь максимум maxsplit + 1 элемент). Если maxsplit не указан или -1, то нет ограничений на количество разделов (все возможные расщепления сделаны). Если указано sep, последовательные разделители не группируются вместе и считаются разграниченными пустыми строками (например, '1, 2'.split(', ') возвращает [' 1 ',' ',' 2 ']). Аргумент sep может состоять из нескольких символов (например, '1 <> 2 <> 3'.split(' <> ') возвращает [' 1 ',' 2 ',' 3 ']). Разделение пустой строки с указанным разделителем возвращает [''].

map (функция, iterable,...)

Примените функцию к каждому элементу итерации и верните список результатов. Если передаются дополнительные повторяющиеся аргументы, функция должна принимать много аргументов и применяется к элементам из всех итераций параллельно. Если один итерабельность короче другого, предполагается, что он расширен с помощью элементов "Нет". Если функция 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')])
  • 0
    Хороший короткий способ сделать это!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню