Python с использованием перечисления внутри списка

Предположим, у меня есть список вроде этого:

mylist = ["a","b","c","d"]

Чтобы получить значения, напечатанные вместе со своим индексом, я могу использовать функцию Python enumerate, подобную этой

>>> for i,j in enumerate(mylist):
...     print i,j
...
0 a
1 b
2 c
3 d
>>>

Теперь, когда я пытаюсь использовать его внутри list comprehension, он дает мне эту ошибку

>>> [i,j for i,j in enumerate(mylist)]
  File "<stdin>", line 1
    [i,j for i,j in enumerate(mylist)]
           ^
SyntaxError: invalid syntax

Итак, мой вопрос: каков правильный способ использования перечислить понимание внутри списка?

Ответ 1

Попробуйте следующее:

[(i, j) for i, j in enumerate(mylist)]

Вам нужно поместить i,j внутри кортежа, чтобы работа над списком выполнялась. В качестве альтернативы, учитывая, что enumerate() уже возвращает кортеж, вы можете вернуть его напрямую, не распаковывая его сначала:

[pair for pair in enumerate(mylist)]

В любом случае результат, который возвращается, как и ожидалось:

> [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

Ответ 2

Просто, чтобы быть действительно ясным, это не имеет ничего общего с enumerate и все, что нужно сделать с синтаксисом понимания списка.

Это понимание списка возвращает список кортежей:

[(i,j) for i in range(3) for j in 'abc']

это список dicts:

[{i:j} for i in range(3) for j in 'abc']

список списков:

[[i,j] for i in range(3) for j in 'abc']

синтаксическая ошибка:

[i,j for i in range(3) for j in 'abc']

Что непоследовательно (IMHO) и запутывает синтаксис понятий словаря:

>>> {i:j for i,j in enumerate('abcdef')}
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}

И набор кортежей:

>>> {(i,j) for i,j in enumerate('abcdef')}
set([(0, 'a'), (4, 'e'), (1, 'b'), (2, 'c'), (5, 'f'), (3, 'd')])

Как заявил Óscar López, вы можете просто передать нумерованный кортеж напрямую:

>>> [t for t in enumerate('abcdef') ] 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f')]

Ответ 3

Или, если вы не настаиваете на использовании понимания списка:

>>> mylist = ["a","b","c","d"]
>>> list(enumerate(mylist))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

Ответ 4

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

~$ python -mtimeit -s"mylist = ['a','b','c','d']" "list(enumerate(mylist))"
1000000 loops, best of 3: 1.61 usec per loop
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[(i, j) for i, j in enumerate(mylist)]"
1000000 loops, best of 3: 0.978 usec per loop
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[t for t in enumerate(mylist)]"
1000000 loops, best of 3: 0.767 usec per loop

Ответ 5

Вот способ сделать это:

>>> mylist = ['a', 'b', 'c', 'd']
>>> [item for item in enumerate(mylist)]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

В качестве альтернативы вы можете:

>>> [(i, j) for i, j in enumerate(mylist)]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

Причина, по которой вы получили сообщение об ошибке, заключалась в том, что вы отсутствовали() вокруг i и j, чтобы сделать ее кортежем.

Ответ 6

Будьте ясны относительно кортежей.

[(i, j) for (i, j) in enumerate(mylist)]

Ответ 7

Все замечательные парни. Я знаю, что вопрос здесь специфичен для перечисления, но как насчет чего-то подобного, просто еще одна перспектива

from itertools import izip, count
a = ["5", "6", "1", "2"]
tupleList = list( izip( count(), a ) )
print(tupleList)

Он становится более мощным, если нужно повторять несколько списков параллельно с точки зрения производительности. Просто мысль

a = ["5", "6", "1", "2"]
b = ["a", "b", "c", "d"]
tupleList = list( izip( count(), a, b ) )
print(tupleList)

Ответ 8

Как обращаться, если mylist = ["a", "b", ["x", "y"], "d"]