programing

목록에서 항목 색인 찾기

kingscode 2022. 10. 29. 12:02
반응형

목록에서 항목 색인 찾기

가 지정되다["foo", "bar", "baz"] 내의 ."bar" 하나요?1

>>> ["foo", "bar", "baz"].index("bar")
1

레퍼런스: [Data Structures]> [ More on Lists ](목록상세)

경고는 다음과 같습니다.

방법이 질문에 답하는 가장 깔끔한 방법일 수 있지만,index의 다소 약한 컴포넌트입니다.listAPI를 마지막으로 사용한 게 언제인지 기억이 안 나요.이 답변은 많이 언급되어 있기 때문에, 보다 완전하게 할 필요가 있다고 코멘트에서 지적되고 있습니다. 관한 몇 가지 list.index★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

list.index(x[, start[, end]])

값이 x와 동일한 첫 번째 항목 목록에서 0 기반 인덱스를 반환합니다. 해당 항목이 없으면 a를 올립니다.

옵션의 인수 start end는 슬라이스 표기법과 동일하게 해석되며 목록의 특정 후속으로 검색을 제한하기 위해 사용됩니다.반환되는 인덱스는 start 인수 대신 전체 시퀀스의 시작을 기준으로 계산됩니다.

목록 길이의 선형 시간 복잡성

index콜은 일치를 찾을 때까지 목록의 모든 요소를 순서대로 체크합니다.목록이 길어서 목록의 어디에 있는지 대략 알 수 없는 경우 이 검색은 병목 현상이 될 수 있습니다.이 경우 다른 데이터 구조를 고려해야 합니다. 「어디서 찾을 수 있는지」를 수.index를 들어,스니펫에서는, 「 」를 참조해 주세요.l.index(999_999, 999_990, 1_000_000).l.index(999_999)전자는 10개의 엔트리만 검색하면 되지만 후자는 100만 개의 엔트리를 검색해야 하기 때문입니다.

>>> import timeit
>>> timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))', number=1000)
9.356267921015387
>>> timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l = list(range(0, 1_000_000))', number=1000)
0.0004404920036904514
 

번째 일치의 인덱스만 해당 인수에 반환합니다.

의 콜index는 일치가 발견될 때까지 순서대로 목록을 검색하고 거기서 정지합니다.더 많은 일치 항목의 인덱스가 필요할 경우 목록 이해 또는 생성기 식을 사용해야 합니다.

>>> [1, 1].index(1)
0
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> next(g)
0
>>> next(g)
2

내가 한때 사용했을 대부분의 장소들은index이치 이치노 만약을 뻗는 것을 하고 있다면index파이썬

목록에 요소가 없는 경우 슬로우합니다.

의 콜index항목이 없는 경우 a가 됩니다.

>>> [1, 1].index(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 2 is not in list

항목이 목록에 없는 경우 다음 중 하나를 수행합니다.

  1. 확인해보겠습니다.item in my_list 수 있는 ) 또는 ('읽을 수 있는 접근법')
  2. 를를 wrap wrap index를 부르다try/except ValueError(최소한 검색할 목록이 길고 항목이 일반적으로 존재하는 경우보다 속도가 빠릅니다.)

Python을 배우는데 정말 도움이 되는 것은 인터랙티브 도움말 기능을 사용하는 것입니다.

>>> help(["foo", "bar", "baz"])
Help on list object:

class list(object)
 ...

 |
 |  index(...)
 |      L.index(value, [start, [stop]]) -> integer -- return first index of value
 |

그것은 종종 당신이 찾고 있는 방법으로 이어질 것입니다.

대부분의 답변은 단일 인덱스를 찾는 방법을 설명하지만 항목이 목록에 여러 번 있는 경우 해당 메서드는 여러 인덱스를 반환하지 않습니다.사용방법:

for i, j in enumerate(['foo', 'bar', 'baz']):
    if j == 'bar':
        print(i)

index()는 첫 하고, 함수는 첫 번째 오카렌스만 반환한다.enumerate()모든 항목을 반환합니다.

목록 이해:

[i for i, j in enumerate(['foo', 'bar', 'baz']) if j == 'bar']

(Enumerate와 거의 동일한 접근법)을 사용하는 또 다른 작은 솔루션도 있습니다.

from itertools import izip as zip, count # izip for maximum efficiency
[i for i, j in zip(count(), ['foo', 'bar', 'baz']) if j == 'bar']

은 것, 다, 보, 보, 다, 다, 다, 다, 다, 다, 다, 다, 다, 다, 다, 다, 다, 다, lists, lists, lists, lists, lists, 보다 많은enumerate():

$ python -m timeit -s "from itertools import izip as zip, count" "[i for i, j in zip(count(), ['foo', 'bar', 'baz']*500) if j == 'bar']"
10000 loops, best of 3: 174 usec per loop
$ python -m timeit "[i for i, j in enumerate(['foo', 'bar', 'baz']*500) if j == 'bar']"
10000 loops, best of 3: 196 usec per loop

모든 인덱스를 가져오려면:

indexes = [i for i,x in enumerate(xs) if x == 'foo']

index()번째 값 인덱스를 반환합니다.

| | 덱 |(...)
| [ [> value | L.index(value, [start, [stop]) -> > > index -- | | | 。

def all_indices(value, qlist):
    indices = []
    idx = -1
    while True:
        try:
            idx = qlist.index(value, idx+1)
            indices.append(idx)
        except ValueError:
            break
    return indices

all_indices("foo", ["foo","bar","baz","foo"])

요소가 목록에 없으면 문제가 발생합니다.이 함수는 이 문제를 처리합니다.

# if element is found it returns index of element else returns None

def find_element_in_list(element, list_element):
    try:
        index_element = list_element.index(element)
        return index_element
    except ValueError:
        return None
a = ["foo","bar","baz",'bar','any','much']

indexes = [index for index in range(len(a)) if a[index] == 'bar']

검색 중인 요소가 목록에 있는지 확인하는 조건을 설정해야 합니다.

if 'your_element' in mylist:
    print mylist.index('your_element')
else:
    print None

모든 인덱스를 원하는 경우 NumPy를 사용할 수 있습니다.

import numpy as np

array = [1, 2, 1, 3, 4, 5, 1]
item = 1
np_array = np.array(array)
item_index = np.where(np_array==item)
print item_index
# Out: (array([0, 2, 6], dtype=int64),)

그것은 명확하고 읽기 쉬운 해결책이다.

여기서 제안하는 모든 기능은 고유한 언어 행동을 재현하지만 무슨 일이 일어나고 있는지 알 수 없습니다.

[i for i in range(len(mylist)) if mylist[i]==myterm]  # get the indices

[each for each in mylist if each==myterm]             # get the items

mylist.index(myterm) if myterm in mylist else None    # get the first index and fail quietly

언어 자체가 원하는 방법을 제공하는 경우 예외 처리를 포함한 함수를 작성하는 이유는 무엇입니까?

Python에서 해당 항목을 포함하는 목록이 주어진 항목의 색인 찾기

의 경우["foo", "bar", "baz"] 내의 ."bar"Python에서 인덱스(1)를 얻는 가장 깨끗한 방법은 무엇입니까?

물론 첫 번째 발생의 인덱스를 반환하는 인덱스 방법이 있습니다.

>>> l = ["foo", "bar", "baz"]
>>> l.index('bar')
1

이 방법에는 몇 가지 문제가 있습니다.

  • '아까운가보다', '아까운가보다', '아까운가보다'가 .ValueError
  • 두 개 이상의 값이 목록에 있는 경우 첫 번째 값에 대한 색인만 가져옵니다.

값 없음

될 수 있는 에는 이 을 잡을 .ValueError.

다음과 같이 재사용 가능한 정의를 사용하여 이를 수행할 수 있습니다.

def index(a_list, value):
    try:
        return a_list.index(value)
    except ValueError:
        return None

그리고 이렇게 사용하세요.

>>> print(index(l, 'quux'))
None
>>> print(index(l, 'bar'))
1

된 값이 맞는지 할 수 입니다.is ★★★★★★★★★★★★★★★★★」is not ★★★★:

result = index(a_list, value)
if result is not None:
    do_something(result)

목록에 두 개 이상의 값이 있습니다.

더 많은 항목이 발생할 수 있는 경우, 다음 웹 사이트를 통해 완전한 정보를 얻을 수 없습니다.list.index:

>>> l.append('bar')
>>> l
['foo', 'bar', 'baz', 'bar']
>>> l.index('bar')              # nothing at index 3?
1

인덱스를 이해하기 위해 목록에 열거할 수 있습니다.

>>> [index for index, v in enumerate(l) if v == 'bar']
[1, 3]
>>> [index for index, v in enumerate(l) if v == 'boink']
[]

발생 빈도가 없는 경우 결과를 부울 체크로 확인할 수 있습니다.또는 결과를 루프할 경우 아무것도 하지 않습니다.

indexes = [index for index, v in enumerate(l) if v == 'boink']
for index in indexes:
    do_something(index)

판다를 통한 데이터 보관 개선

판다가 있는 경우 Series 개체를 사용하여 다음과 같은 정보를 쉽게 얻을 수 있습니다.

>>> import pandas as pd
>>> series = pd.Series(l)
>>> series
0    foo
1    bar
2    baz
3    bar
dtype: object

비교 검사에서 일련의 부란이 반환됩니다.

>>> series == 'bar'
0    False
1     True
2    False
3     True
dtype: bool

해당 일련의 부란을 첨자 표기법을 통해 시리즈에 전달하면 일치하는 부재만 얻을 수 있습니다.

>>> series[series == 'bar']
1    bar
3    bar
dtype: object

인덱스만 원하는 경우 인덱스 속성은 일련의 정수를 반환합니다.

>>> series[series == 'bar'].index
Int64Index([1, 3], dtype='int64')

리스트나 태플에 포함시키고 싶은 경우는, 작성자에게 전달해 주세요.

>>> list(series[series == 'bar'].index)
[1, 3]

네, 목록 이해는 열거와 함께 사용할 수도 있지만, 제 생각에는 그렇게 우아하지 않습니다. Python에서는 C로 작성된 내장 코드를 처리하는 대신 동등성을 테스트하고 있습니다.

>>> [i for i, value in enumerate(l) if value == 'bar']
[1, 3]

이것이 XY의 문제입니까?

XY문제는실제문제가아닌시도된솔루션에대한질문입니다.

목록의 요소가 지정된 색인이 필요한 이유는 무엇이라고 생각하십니까?

값을 이미 알고 있다면 목록 내 어디에 있는지 왜 신경써야 합니까?

, '잡다', '', '잡다', '잡다', '잡다'가 있습니다.ValueError다소 장황한 표현입니다.그리고 저는 그것을 피하고 싶습니다.

저는 보통 목록을 반복하기 때문에 흥미로운 정보에 대한 포인터를 가지고 열거형 인덱스를 가져옵니다.

데이터를 보관하고 있다면 판다를 사용해야 할 것입니다. 판다에는 지금까지 보여드린 Python의 순수한 회피책보다 훨씬 우아한 도구가 있습니다.

했던 list.index표준 해 본 를 알 수 .하지만 Python의 표준 라이브러리를 살펴보니 그 용도가 훌륭합니다.

에는, 여러가지 용도가 있습니다.idlelib 및 해석의 GUI를 사용합니다.

keyword은 모듈 통해 키워드 합니다.

Lib/mailbox.py 에서는, 순서 있는 매핑과 같이 사용하고 있는 것 같습니다.

key_list[key_list.index(old)] = new

그리고.

del key_list[key_list.index(key)]

Lib/http/cookiejar.py에서는 다음 달을 얻기 위해 사용되는 것으로 보입니다.

mon = MONTHS_LOWER.index(mon.lower())+1

Lib/tarfile.py에서 distutils와 유사한 슬라이스를 항목까지 가져옵니다.

members = members[:members.index(tarinfo)]

Lib/pickletools에 있습니다.py:

numtopop = before.index(markobject)

(중요한 은 O 시간 하는 것 .list.indexUI를 사용하다

사용 사례는 있지만, 매우 드문 경우입니다.이 답을 찾고 있다면 사용 사례에 맞는 언어로 제공되는 도구를 가장 직접 사용하는지 자문해 보십시오.

목록에서 하나 이상의 항목(동일)의 모든 항목 및 위치 가져오기

enumerate(alist)를 사용하면 x 요소가 원하는 것과 같을 때 목록의 색인인 첫 번째 요소 n을 저장할 수 있습니다.

>>> alist = ['foo', 'spam', 'egg', 'foo']
>>> foo_indexes = [n for n,x in enumerate(alist) if x=='foo']
>>> foo_indexes
[0, 3]
>>>

함수 findindindex를 만듭니다.

이 함수는 항목과 목록을 인수로 사용하여 이전에 살펴본 것처럼 목록 내 항목의 위치를 반환합니다.

def indexlist(item2find, list_or_string):
  "Returns all indexes of an item in a list or a string"
  return [n for n,item in enumerate(list_or_string) if item==item2find]

print(indexlist("1", "010101010"))

산출량


[1, 3, 5, 7]

간단하죠.

for n, i in enumerate([1, 2, 3, 4, 1]):
    if i == 1:
        print(n)

출력:

0
4
me = ["foo", "bar", "baz"]
me.index("bar") 

목록의 모든 구성원에 대해 색인을 가져올 수 있습니다.

다음 기능이 있는 모든 인덱스:

get_indexes = lambda x, xs: [i for (y, i) in zip(xs, range(len(xs))) if x == y]

print get_indexes(2, [1, 2, 3, 4, 5, 6, 3, 2, 3, 2])
print get_indexes('f', 'xsfhhttytffsafweef')

간단히 말하면

a = [['hand', 'head'], ['phone', 'wallet'], ['lost', 'stock']]
b = ['phone', 'lost']

res = [[x[0] for x in a].index(y) for y in b]

다른 옵션

>>> a = ['red', 'blue', 'green', 'red']
>>> b = 'red'
>>> offset = 0;
>>> indices = list()
>>> for i in range(a.count(b)):
...     indices.append(a.index(b,offset))
...     offset = indices[-1]+1
... 
>>> indices
[0, 3]
>>> 

그리고 지금, 완전히 다른 무언가를 위해...

...인덱스를 얻기 전에 아이템의 존재를 확인하는 것과 같습니다.이 접근법의 장점은 함수가 항상 인덱스 목록을 반환한다는 것입니다. 빈 목록이라도 마찬가지입니다.그것은 끈으로도 작동한다.

def indices(l, val):
    """Always returns a list containing the indices of val in the_list"""
    retval = []
    last = 0
    while val in l[last:]:
            i = l[last:].index(val)
            retval.append(last + i)
            last += i + 1   
    return retval

l = ['bar','foo','bar','baz','bar','bar']
q = 'bar'
print indices(l,q)
print indices(l,'bat')
print indices('abcdaababb','a')

인터랙티브한 파이썬 창에 붙여넣을 경우:

Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def indices(the_list, val):
...     """Always returns a list containing the indices of val in the_list"""
...     retval = []
...     last = 0
...     while val in the_list[last:]:
...             i = the_list[last:].index(val)
...             retval.append(last + i)
...             last += i + 1   
...     return retval
... 
>>> l = ['bar','foo','bar','baz','bar','bar']
>>> q = 'bar'
>>> print indices(l,q)
[0, 2, 4, 5]
>>> print indices(l,'bat')
[]
>>> print indices('abcdaababb','a')
[0, 4, 5, 7]
>>> 

갱신하다

앞으로 1년 동안 머리 아래로 python을 개발하면 원래의 답변에 조금 당황하기 때문에 기록을 바로 세우기 위해 위의 코드를 사용할 수 있지만, 같은 동작을 얻기 위한 훨씬 더 관용적인 방법은 목록 이해와 함께 enumerate() 함수를 사용하는 것입니다.

다음과 같은 경우:

def indices(l, val):
    """Always returns a list containing the indices of val in the_list"""
    return [index for index, value in enumerate(l) if value == val]

l = ['bar','foo','bar','baz','bar','bar']
q = 'bar'
print indices(l,q)
print indices(l,'bat')
print indices('abcdaababb','a')

인터랙티브한 파이썬 창에 붙여넣으면 다음과 같은 결과를 얻을 수 있습니다.

Python 2.7.14 |Anaconda, Inc.| (default, Dec  7 2017, 11:07:58) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def indices(l, val):
...     """Always returns a list containing the indices of val in the_list"""
...     return [index for index, value in enumerate(l) if value == val]
... 
>>> l = ['bar','foo','bar','baz','bar','bar']
>>> q = 'bar'
>>> print indices(l,q)
[0, 2, 4, 5]
>>> print indices(l,'bat')
[]
>>> print indices('abcdaababb','a')
[0, 4, 5, 7]
>>> 

그리고 이 질문과 모든 답을 검토한 후, 이것이 바로 FMC가 그의 이전 답변에서 제시한 것임을 깨달았습니다.처음에 이 질문에 대답했을 때, 저는 그 답을 보지 못했어요. 왜냐하면 저는 그것을 이해하지 못했기 때문이죠.나는 다소 장황한 나의 예가 이해에 도움이 되기를 바란다.

위의 코드 한 줄이 여전히 이해가 된다면 구글 '피톤 목록 이해'를 통해 몇 분 정도 시간을 내어 익숙해질 것을 강력히 권장합니다.이것은 Python을 사용하여 코드를 개발하는 것을 즐겁게 하는 많은 강력한 기능 중 하나일 뿐입니다.

친구여, 나는 당신의 궁금증을 해결할 가장 쉬운 코드를 만들었습니다.당신이 거대한 코드를 받는 동안, 나는 당신에게 두 줄의 코드를 제공하려고 여기 있습니다. 이치index()비단뱀

LIST = ['foo' ,'boo', 'shoo']
print(LIST.index('boo'))

출력:

1

제가 당신에게 큰 도움이 될 수 있는 가장 좋고 간단한 답변을 드렸기를 바랍니다.

FMC 및 user7177의 답변에 대한 변형은 모든 엔트리에 대해 모든 인덱스를 반환할 수 있는 dict를 제공합니다.

>>> a = ['foo','bar','baz','bar','any', 'foo', 'much']
>>> l = dict(zip(set(a), map(lambda y: [i for i,z in enumerate(a) if z is y ], set(a))))
>>> l['foo']
[0, 5]
>>> l ['much']
[6]
>>> l
{'baz': [2], 'foo': [0, 5], 'bar': [1, 3], 'any': [4], 'much': [6]}
>>> 

또한 이 항목을 하나의 라이너로 사용하여 단일 항목에 대한 모든 인덱스를 가져올 수도 있습니다.람다 호출 횟수를 줄이기 위해 set(a)를 사용했지만 효율성에 대한 보장은 없습니다.

목록 L에서 항목 x의 색인 찾기:

idx = L.index(x) if (x in L) else -1

이면서 '초보자', '초보자', '', '초보자', '초보자', '초보자', '초보자', '초보자', '초보자', '초보자', '초보자', '초보자', '초보자', '초보자', '초보자', '초보자', '초보자', '초보자', '초보자', '초보자, 초보자, 초보자, 초보자, 초보자, 초보자, 초보자, 초보자, 초보자, 초보자, 초보자, 초보자, 초보자, 초보자, 초보자, 초보자, 초보자'for루프는 ValueError를 회피하면서 항목의 첫 번째 인덱스를 찾을 수 있습니다.

def find_element(p,t):
    i = 0
    for e in p:
        if e == t:
            return i
        else:
            i +=1
    return -1

이 값이 존재하지 않을 수 있으므로 이 ValueError를 피하기 위해 목록에 실제로 해당 값이 존재하는지 여부를 확인할 수 있습니다.

list =  ["foo", "bar", "baz"]

item_to_find = "foo"

if item_to_find in list:
      index = list.index(item_to_find)
      print("Index of the item is " + str(index))
else:
    print("That word does not exist") 

의 기능인 비단뱀을 합니다.array.index()Try / 레코드의 이 반환됩니다('Try/Except' ).indexOf()를 참조해 주세요.

fruits = ['apple', 'banana', 'cherry']

try:
  pos = fruits.index("mango")
except:
  pos = -1

는 목록에 .fruits에, so sopos -1입니다. 자,그러면요.pos2번으로 하다

목록 이해는 목록의 항목 색인을 찾는 데 있어 콤팩트한 구현을 획득하기 위한 최선의 선택이다.

a_list = ["a", "b", "a"]
print([index for (index , item) in enumerate(a_list) if item == "a"])

이것에 대한 보다 기능적인 답이 있다.

list(filter(lambda x: x[1]=="bar",enumerate(["foo", "bar", "baz", "bar", "baz", "bar", "a", "b", "c"])))

더 일반적인 형식:

def get_index_of(lst, element):
    return list(map(lambda x: x[0],\
       (list(filter(lambda x: x[1]==element, enumerate(lst))))))

Python 이 python index()메서드 그 '아까', '아까', '아까', '아까', '아까', '', '와 비슷하게.indexOf()-1" " " 목을 、 " 、 " 는는는 。

try:
    index = array.index('search_keyword')
except ValueError:
    index = -1
name ="bar"
list = [["foo", 1], ["bar", 2], ["baz", 3]]
new_list=[]
for item in list:
    new_list.append(item[0])
print(new_list)
try:
    location= new_list.index(name)
except:
    location=-1
print (location)

해당 문자열이 에도 해당 문자열이 목록에 없는 됩니다.location = -1

동등한 것 중 하나

# Throws ValueError if nothing is found
some_list = ['foo', 'bar', 'baz'].index('baz')
# some_list == 2

커스텀 술어

some_list = [item1, item2, item3]

# Throws StopIteration if nothing is found
# *unless* you provide a second parameter to `next`
index_of_value_you_like = next(
    i for i, item in enumerate(some_list)
    if item.matches_your_criteria())

모든 항목의 인덱스를 술어로 찾는 중

index_of_staff_members = [
    i for i, user in enumerate(users)
    if user.is_staff()]

Python 리스트는 제로 베이스이므로 다음과 같이 zip 내장 기능을 사용할 수 있습니다.

>>> [i for i,j in zip(range(len(haystack)), haystack) if j == 'needle' ]

여기서 "substack"은 문제의 목록이고 "substack"은 찾는 항목입니다.

(주의: 여기에서는 인덱스를 얻기 위해 i를 사용하여 반복하고 있지만, 아이템에 초점을 맞추고 싶다면 j로 전환할 수 있습니다.)

성능에 문제가 있는 경우:

에서 ''이라고.list.index(item) 알고리즘입니다.method는 O(n)입니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★그러나 요소의 인덱스에 여러 번 액세스해야 하는 경우에는 먼저 항목-인덱스 쌍의 사전(O(n))을 만든 다음 필요할 때마다 O(1)에서 인덱스에 액세스하는 것이 더 적합합니다.

목록의 항목이 반복되지 않을 경우 다음을 쉽게 수행할 수 있습니다.

myList = ["foo", "bar", "baz"]

# Create the dictionary
myDict = dict((e,i) for i,e in enumerate(myList))

# Lookup
myDict["bar"] # Returns 1
# myDict.get("blah") if you don't want an error to be raised if element not found.

중복된 요소가 있을 수 있으며 모든 인덱스를 반환해야 하는 경우:

from collections import defaultdict as dd
myList = ["foo", "bar", "bar", "baz", "foo"]

# Create the dictionary
myDict = dd(list)
for i,e in enumerate(myList):
    myDict[e].append(i)

# Lookup
myDict["foo"] # Returns [0, 4]

언급URL : https://stackoverflow.com/questions/176918/finding-the-index-of-an-item-in-a-list

반응형