복붙노트

[PYTHON] Python - 목록의 목록에서 항목의 색인 찾기

PYTHON

Python - 목록의 목록에서 항목의 색인 찾기

목록 목록이 있습니다.

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

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

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

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

    4.아마도 numpy를 사용하면 더 간단 할 것입니다.

    아마도 numpy를 사용하면 더 간단 할 것입니다.

    >>> import numpy
    >>> ar = numpy.array(colours)
    >>> numpy.where(ar=="#fff224")
    (array([2]), array([1]))
    

    보시다시피, 모든 행과 열 인덱스를 가진 튜플을 얻을 수 있습니다.

  5. ==============================

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

    6.당신이 할 수있는 또 다른 일은 당신이 원하는리스트의 섹션을 선택한 다음 그것을 찾기 위해 인덱스를 사용하는 것입니다.

    당신이 할 수있는 또 다른 일은 당신이 원하는리스트의 섹션을 선택한 다음 그것을 찾기 위해 인덱스를 사용하는 것입니다.

    list_name[0].index("I want coffee")
    
  7. 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