Вопрос по iteration, list, list-comprehension, python – Python с использованием перечисления внутри понимания списка

111

Предположим, у меня есть такой список:

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

Чтобы получить значения, напечатанные вместе с их индексом, я могу использовать Pythonenumerate функционировать так

>>> 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

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

Ваш Ответ

7   ответов
5

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

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

Попробуй это:

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

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

[pair for pair in enumerate(mylist)]

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

> [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
Не обязательно быть кортежем. Любое выражение, использующее i и j, которое возвращает значение, подойдет
Использование перечисления отлично, как насчет того, чтобы сделать его более эффективным с помощью itertools
Просто помните, что кортеж создается, not (), Итакi,j внутри кортежа & quot; не имеет смысла, так какi,j это уже кортеж! Проблема в том, что парсеру компилятора списка нужны парены для группы операторов.
42

enumerate и все, что связано с синтаксисом понимания списка.

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

[(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']

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

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

Что противоречиво (ИМХО) и путает со синтаксическим пониманием словаря:

>>> {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')])

Как указано <шрам L & # xF3; pez, вы можете просто передать перечислимый кортеж напрямую:

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

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

~$ 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
+1 Я не проверял, но поспорим[t for t in enumerate(my list)] еще быстрее.
Только что обновил. Вы правы.
0

ребята. Я знаю, что вопрос здесь специфичен для перечисления, но как насчет этого, просто другая точка зрения?

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', '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 сделать это кортежем.

Похожие вопросы