Как получить значение по определенному индексу в списке питонов? - PullRequest
6 голосов
/ 22 декабря 2009

У меня есть список, который выглядит примерно так

List = [q1,a1,q2,a2,q3,a3]

Мне нужен финальный код, похожий на этот

dictionary = {q1:a1,q2:a2,q3:a3}

если только я могу получить значения по определенному индексу, например List [0] Я могу это сделать, есть ли способ получить его?

Ответы [ 5 ]

11 голосов
/ 22 декабря 2009

Использование расширенной записи среза:

dictionary = dict(zip(List[0::2], List[1::2]))
11 голосов
/ 22 декабря 2009

Словари Python могут быть построены с использованием класса dict, учитывая итерацию, содержащую кортежи. Мы можем использовать это вместе со встроенной функцией range, чтобы создать набор кортежей, как в (Every-Odd-Item, Every-Even-Item), и передать его в dict, так что значения организуются в ключ пары / значение в конечном результате:

dictionary = dict([(List[i], List[i+1]) for i in range(0, len(List), 2)])
3 голосов
/ 22 декабря 2009

Ответ на основе диапазона более прост, но возможен другой подход с использованием пакета itertools:

from itertools import izip
dictionary = dict(izip(*[iter(List)] * 2))

Разбивка ( редактировать: проверено на этот раз):

# Create instance of iterator wrapped around List
# which will consume items one at a time when called.
iter(List)

# Put reference to iterator into list and duplicate it so
# there are two references to the *same* iterator.
[iter(List)] * 2 

# Pass each item in the list as a separate argument to the
# izip() function.  This uses the special * syntax that takes
# a sequence and spreads it across a number of positional arguments.
izip(* [iter(List)] * 2)

# Use regular dict() constructor, same as in the answer by zzzeeek
dict(izip(* [iter(List)] * 2))

Редактировать : большое спасибо острым глазам Криса Латца за двойную коррекцию.

2 голосов
/ 22 декабря 2009
d = {}
for i in range(0, len(List), 2):
    d[List[i]] = List[i+1]
0 голосов
/ 22 декабря 2009

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

from itertools import izip

dictionary = {}
for k, v in izip(List[::2], List[1::2]):
    if k not in dictionary:
        dictionary[k] = set()
    dictionary[k].add(v)

Или мы могли бы использовать collections.defaultdict, поэтому нам не нужно проверять, инициализирован ли ключ:

from itertools import izip
from collections import defaultdict

dictionary = defaultdict(set)
for k, v in izip(List[::2], List[1::2]):
    dictionary[k].add(v)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...