목록에서 아이템의 위치를 ​​얻는 방법?


169

목록을 반복하고 특정 조건을 충족하면 항목의 색인을 인쇄하고 싶습니다. 어떻게해야합니까?

예:

testlist = [1,2,3,5,3,1,2,1,6]
for item in testlist:
    if item == 1:
        print position

답변:


280

흠. 여기에 목록 이해력이있는 대답이 있었지만 사라졌습니다.

여기:

 [i for i,x in enumerate(testlist) if x == 1]

예:

>>> testlist
[1, 2, 3, 5, 3, 1, 2, 1, 6]
>>> [i for i,x in enumerate(testlist) if x == 1]
[0, 5, 7]

최신 정보:

자, 제너레이터 표현식이 필요합니다. 제너레이터 표현식이 있습니다. 다음은 for 루프에서 목록 이해력을 다시 보여줍니다.

>>> for i in [i for i,x in enumerate(testlist) if x == 1]:
...     print i
... 
0
5
7

이제 발전기를 만들겠습니다 ...

>>> (i for i,x in enumerate(testlist) if x == 1)
<generator object at 0x6b508>
>>> for i in (i for i,x in enumerate(testlist) if x == 1):
...     print i
... 
0
5
7

그리고 충분히, 우리는 변수에 변수를 할당하고 거기에서 사용할 수 있습니다 ...

>>> gen = (i for i,x in enumerate(testlist) if x == 1)
>>> for i in gen: print i
... 
0
5
7

그리고 내가 FORTRAN을 쓰는 데 사용했다고 생각합니다.


6
아마도 25 년 동안 함수형 프로그래밍에 의문을 품은 후에 마침내 단서가 생겼다고 생각합니다. 목록 이해는 폭탄입니다.
Charlie Martin

15
나는 당신이 "단일 문자"를 의미한다고 생각합니다. 솔직히이 예에서 더 긴 이름은 더 이상 정보 내용이 없을 것입니다.
Charlie Martin

2
좋은 답변 주셔서 감사합니다. @nailer의 의견은 생성기 예제에서 한 줄로 두 개의 다른 컨텍스트에서 'i'를 사용한다는 사실과 관련이 있다고 생각합니다. 하나는 이해 내부이고 다른 하나는 그것을 통해 반복됩니다. 나는 그것이 나를 잠시 버렸다는 것을 안다.
브라운

1
@CharlieMartin 단일 문자 변수에 대한 하나의 공통 규칙에 따라 항목 대신 인덱스에 'i'를 사용합니다. 색인 'index'와 항목 'item'의 이름을 지정하면 모호성이 제거됩니다. 또한 'item'과 'position'을 사용하는 부모에게 응답하고 있으며 응답에서 원래 코드의 일부를 불필요하게 이름을 바꾸지 않는 것이 좋습니다.
mikemaccana

1
슈퍼 구문 : o) 명령 줄 매개 변수를 쉽게 얻을 수 있습니다. 인수 배열을 보자 args = ['x', '-p1', 'v1', '-p2', 'v2']. 그런 다음 명령이 args[[i for i, x in enumerate(args) if x == '-p1'][0] + 1]반환됩니다'v1'
Theodor Keinstein

170

다음은 어떻습니까?

print testlist.index(element)

찾을 요소가 실제로 목록에 있는지 확실하지 않은 경우와 같이 예비 점검을 추가 할 수 있습니다.

if element in testlist:
    print testlist.index(element)

또는

print(testlist.index(element) if element in testlist else None)

코드가 덜 명확하지만 때로는 더 효율적이기 때문에 마음에 들지 않는 "파이 토닉 방식"

try:
    print testlist.index(element)
except ValueError:
    pass

5
액세스하기 전에 테스트하는 대신 시도하고 확인할 수도 있습니다.ValueError
kratenko

나는 그가 모든 사건을 찾기를 원한다고 생각합니다. 첫 번째 사건 만주는 것 같습니다.
tfv

@tfv 질문에 "항목"이 아니라 "항목"이라는 말이 있기 때문에 어떻게 이러한 결론에 도달 할 수 있는지 모르겠습니다.
mmj

40

열거 형 사용 :

testlist = [1,2,3,5,3,1,2,1,6]
for position, item in enumerate(testlist):
    if item == 1:
        print position

10
for i in xrange(len(testlist)):
  if testlist[i] == 1:
    print i

요청 된 범위 대신 xrange (주석 참조).


range ()를 xrange ()로 교체-range ()는 목록을 만들고 xrange ()는 반복자를 만듭니다. xrange ()는 메모리를 적게 사용하고 초기 호출이 더 빠릅니다.
gnud

2
파이썬 2 프로그램의 큰 목록에 동의합니다. 'range'는 여전히 python 3에서 작동하지만 xrange IIRC와 같이 작동합니다. 'xrange'는 공룡의 길을 가고 있습니다.
jakber

2
업데이트 : xrange새로운 같이, 파이썬 3.x를에 depracted되어 range이전이다xrange
팀 - 오

5

이 작업을 수행하는 다른 방법이 있습니다.

try:
   id = testlist.index('1')
   print testlist[id]
except ValueError:
   print "Not Found"


2

아래를 시도하십시오 :

testlist = [1,2,3,5,3,1,2,1,6]    
position=0
for i in testlist:
   if i == 1:
      print(position)
   position=position+1

1

목록이 충분히 커져서 적은 수의 인덱스에서 값을 찾을 것으로 예상 되는 경우 목록의 모든 값을 반복 할 필요가 없기 때문에이 코드 훨씬 빠르게 실행될 수 있다고 생각 하십시오.

lookingFor = 1
i = 0
index = 0
try:
  while i < len(testlist):
    index = testlist.index(lookingFor,i)
    i = index + 1
    print index
except ValueError: #testlist.index() cannot find lookingFor
  pass

값을 많이 찾으려면 목록에 "인덱스"를 추가하고 마지막에 목록을 인쇄하여 반복 당 시간을 절약해야합니다.


타이밍 테스트를했습니다. 목록 이해 기술은이 코드보다 38 % 빠릅니다. (인쇄 명세서를 outputlist.append 호출로 대체했습니다.)
Deestan

또한 1에서 100 사이의 100000 임의 값의 목록 크기로 일부 테스트를 수행했습니다. 작성한 코드는 경우에 따라 두 배 빠릅니다. 시간 테스트는 포스터의 응용 프로그램과 비교할 수 없습니다 (물론 확실하게 테스트해야합니다). 내 의견이이 게시물에 유해한 경우 사과드립니다.

0

Tkinter 라이브러리의 curselection () 메소드를 사용하는 것이 유용 할 수 있다고 생각합니다.

from Tkinter import * 
listbox.curselection()

이 방법은 Tkinter 목록 상자 위젯에서 작동하므로 목록 대신 위젯 중 하나를 구성해야합니다.

이것은 다음과 같은 위치를 반환합니다 :

( '0',) (Tkinter의 이후 버전은 대신 int 목록을 반환 할 수 있지만)

어느 것이 첫 번째 위치이며 항목 위치에 따라 번호가 변경됩니다.

자세한 내용은 다음 페이지를 참조하십시오. http://effbot.org/tkinterbook/listbox.htm

인사말.


1
재미있는 생각. 그러나 전체 Tkinter 라이브러리를 가져와야하므로 문제를 해결하는 가장 효율적인 방법은 아닙니다.
seaotternerd 2016 년

3
이것은 다소 비효율적이며 구불 구불 한 길이므로 질문에 다소 답이 있더라도 잘못된 대답이라고 말할 것입니다.

이 답변은 질문과 관련이 없습니다.
Cody Piersall

0

왜 복잡한가?

testlist = [1,2,3,5,3,1,2,1,6]
for position, item in enumerate(testlist):
    if item == 1:
        print position

0

그냥과 함께 완전한 예를 설명하기 위해 input_list이있다 searies1(예 : input_list를 [0]) 당신의 검색을 수행하고자하는 series2(예 : input_list [1])하고 시리즈 1에있는 경우 시리즈 2의 인덱스를 얻을.

참고 : certain condition조건이 간단한 경우 람다 식으로 갈 것입니다

input_list = [[1,2,3,4,5,6,7],[1,3,7]]
series1 = input_list[0]
series2 = input_list[1]
idx_list = list(map(lambda item: series1.index(item) if item in series1 else None, series2))
print(idx_list)

산출:

[0, 2, 6]

-2
testlist = [1,2,3,5,3,1,2,1,6]
for id, value in enumerate(testlist):
    if id == 1:
        print testlist[id]

나는 그것이 당신이 원하는 것이 정확하다고 생각합니다. ;-) 'id'는 항상 목록에있는 값의 색인입니다.

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