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