[PYTHON] Python - 목록의 목록에서 항목의 색인 찾기
PYTHONPython - 목록의 목록에서 항목의 색인 찾기
목록 목록이 있습니다.
colours=[["#660000","#863030","#ba4a4a","#de7e7e","#ffaaaa"],["#a34b00","#d46200","#ff7a04","#ff9b42","#fec28d"],["#dfd248","#fff224","#eefd5d","#f5ff92","#f9ffbf"],["#006600","#308630","#4aba4a","#7ede7e","#aaffaa"]]
목록을 검색하는 가장 깨끗한 방법은 무엇이며 항목 중 하나의 위치를 반환합니다 (예 : "# 660000"?
나는 인덱스 메소드를 살펴 봤지만리스트 안의리스트를 언팩하지는 않는다.
postion=colours.index("#660000")
제공합니다 : ValueError : [ '# 660000']이 (가) 목록에 없으며 [0] [0]이 아닙니다 ...
해결법
-
==============================
1.나는 이런 식으로 할 것입니다 :
나는 이런 식으로 할 것입니다 :
[(i, colour.index(c)) for i, colour in enumerate(colours) if c in colour]
첫 번째 인덱스는 첫 번째 목록의 위치이고 두 번째 인덱스는 두 번째 목록의 위치입니다 (참고 : c는 찾고있는 색, 즉 "# 660000"입니다).
질문의 예제에서 반환 값은 다음과 같습니다.
[(0, 0)]
게으른 방법으로 색상이있는 첫 번째 위치를 찾으려면 다음을 사용할 수 있습니다.
next(((i, colour.index(c)) for i, colour in enumerate(colours) if c in colour), None)
발견 된 첫 번째 요소에 대한 튜플을 반환하거나 요소가 없으면 None을 반환합니다. 요소가 발견되지 않으면 StopIteration 예외를 발생시키는 위의 None 인수를 제거 할 수도 있습니다.
편집 : @ RikPoggi 올바르게 지적으로 일치하는 숫자가 높은 경우 색상을 두 번 반복하여 찾을 수 있기 때문에 약간의 오버 헤드가 c를 찾을 수 있습니다. 적은 수의 성냥에 대해서는 합리적인 것으로 생각하고 하나의 표현으로 대답을했습니다. 그러나이를 피하기 위해 다음과 같은 아이디어를 사용하여 메소드를 정의 할 수도 있습니다.
def find(c): for i, colour in enumerate(colours): try: j = colour.index(c) except ValueError: continue yield i, j matches = [match for match in find('#660000')]
find는 생성자이기 때문에 위의 예제 에서처럼 first match에서 멈추고 더 이상 보이지 않게 건너 뛸 수 있습니다.
-
==============================
2.enumerate ()를 사용하면 다음과 같은 함수를 작성할 수 있습니다.
enumerate ()를 사용하면 다음과 같은 함수를 작성할 수 있습니다.
def find(target): for i,lst in enumerate(colours): for j,color in enumerate(lst): if color == "#660000": return (i, j) return (None, None)
-
==============================
3.대상 하위 목록을 두 번 반복하는 것을 피하려면 최상위 (가장 Python 적) 이동 방법이 루프 인 것 같습니다.
대상 하위 목록을 두 번 반복하는 것을 피하려면 최상위 (가장 Python 적) 이동 방법이 루프 인 것 같습니다.
def find_in_sublists(lst, value): for sub_i, sublist in enumerate(lst): try: return (sub_i, sublist.index(value)) except ValueError: pass raise ValueError('%s is not in lists' % value)
-
==============================
4.아마도 numpy를 사용하면 더 간단 할 것입니다.
아마도 numpy를 사용하면 더 간단 할 것입니다.
>>> import numpy >>> ar = numpy.array(colours) >>> numpy.where(ar=="#fff224") (array([2]), array([1]))
보시다시피, 모든 행과 열 인덱스를 가진 튜플을 얻을 수 있습니다.
-
==============================
5.파이썬 3에서는이 패턴을 사용했습니다.
파이썬 3에서는이 패턴을 사용했습니다.
CATEGORIES = [ [1, 'New', 'Sub-Issue', '', 1], [2, 'Replace', 'Sub-Issue', '', 5], [3, 'Move', 'Sub-Issue', '', 7], ] # return single item by indexing the sub list next(c for c in CATEGORIES if c[0] == 2)
-
==============================
6.당신이 할 수있는 또 다른 일은 당신이 원하는리스트의 섹션을 선택한 다음 그것을 찾기 위해 인덱스를 사용하는 것입니다.
당신이 할 수있는 또 다른 일은 당신이 원하는리스트의 섹션을 선택한 다음 그것을 찾기 위해 인덱스를 사용하는 것입니다.
list_name[0].index("I want coffee")
from https://stackoverflow.com/questions/9553638/python-find-the-index-of-an-item-in-a-list-of-lists by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 왜 PyQt connect () 구문이 그렇게 장황합니까? (0) | 2018.11.28 |
---|---|
[PYTHON] sklearn : 다항식의 계수를 구하는 방법 (0) | 2018.11.28 |
[PYTHON] 래핑 된 함수 앞과 뒤에 어떤 코드를 실행하는 함수와 멤버 함수 위에 래퍼를 쓰는 방법? (0) | 2018.11.28 |
[PYTHON] 창에서 파이썬 기능 제한 시간 초과 (0) | 2018.11.27 |
[PYTHON] 한 번에 OpenCV에서 두 카메라의 비디오 캡처 (0) | 2018.11.27 |