내부 목록 이해를 열거하는 파이썬


125

다음과 같은 목록이 있다고 가정 해 봅시다.

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

색인과 함께 값을 인쇄하려면 다음 enumerate과 같이 Python 함수를 사용할 수 있습니다

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

그래서 내 질문은 : 목록 이해 내에서 열거 형을 사용하는 올바른 방법은 무엇입니까?

답변:


166

이 시도:

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

4
튜플이어야하는 것은 아닙니다. 값을 반환하는 i와 j를 사용하는 모든 표현은 다음과 같습니다
Alvaro

itertools를 사용하여 열거를보다 효율적으로 만드는 방법은
어떻습니까

3
그냥 튜플에 의해 내장되어 있음을 기억 , 하지() . 따라서 이미 i,j튜플 이므로 " 튜플 내부에 넣기 "는 의미가 없습니다 i,j! 문제는 목록 작성 구문 분석기가 명령문 그룹에 대한 구문 분석기가 필요하다는 것입니다.
cowbert

46

정말로 명확하게 말하면, 이것은 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')]

32

또는 목록 이해를 사용하지 않으려는 경우 :

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

12

긴 목록을 사용하는 경우 더 읽기 쉬운 것은 아니지만 목록 이해력이 더 빠릅니다.

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

2
+1 테스트하지는 않았지만 [t for t in enumerate(my list)]더 빠를 것입니다.
늑대

11

방법은 다음과 같습니다.

>>> 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그것을 튜플 할 수 있습니다.



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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.