sourcetip

Python에서 개체 목록 검색

fileupload 2023. 7. 27. 22:14
반응형

Python에서 개체 목록 검색

제가 C 스타일 구조와 유사하게 데이터 요소를 저장하기 위한 간단한 클래스를 만들고 있다고 가정해 보겠습니다.저는 특정 값과 동일한 속성을 가진 개체 목록에서 개체를 검색하는 방법을 찾고 있습니다.다음은 제가 하려는 일을 설명하기 위한 간단한 예입니다.

예를 들어:

class Data:
    pass

myList = []

for i in range(20):
    data = Data()
    data.n = i
    data.n_squared = i * i
    myList.append(data)

myList 목록에 n == 5의 요소가 포함되어 있는지 확인하려면 어떻게 해야 합니까?

저는 구글링을 하고 파이썬 문서를 검색해봤는데, 목록 이해력으로 이 일을 할 수 있을 것 같은데, 잘 모르겠습니다.참고로 저는 파이썬 2.4.3을 사용해야 하기 때문에 새로운 지위즈 2.6 또는 3.x 기능을 사용할 수 없습니다.

목록 이해와 일치하는 모든 요소의 목록을 얻을 수 있습니다.

[x for x in myList if x.n == 30]  # list of all elements with .n==30

목록에 일치하는 요소가 포함되어 있는지 확인하고 (상대적으로) 효율적으로 수행하려면 다음 작업을 수행할 수 있습니다.

def contains(list, filter):
    for x in list:
        if filter(x):
            return True
    return False

if contains(myList, lambda x: x.n == 3)  # True if any element has .n==3
    # do stuff

단순하고 우아하며 강력한 성능:

기본 제공...(python 2.5+)과 함께 사용되는 생성기 식

any(x for x in mylist if x.n == 10)

다음과 같이 정의된 Python 내장형을 사용합니다.

임의의(반복할 수 있는) ->반복 가능한 요소 중 하나라도 참이면 True를 반환합니다.다음과 동일:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

완벽함을 위해, 가능한 가장 간단한 것을 잊지 말자:

for i in list:
  if i.n == 5:
     # do something with it
     print "YAY! Found one!"
[x for x in myList if x.n == 30]               # list of all matches
[x.n_squared for x in myList if x.n == 30]     # property of matches
any(x.n == 30 for x in myList)                 # if there is any matches
[i for i,x in enumerate(myList) if x.n == 30]  # indices of all matches

def first(iterable, default=None):
  for item in iterable:
    return item
  return default

first(x for x in myList if x.n == 30)          # the first match, if any
filter(lambda x: x.n == 5, myList)

사용할 수 있습니다.in모음에서 항목을 찾고 관심 있는 필드를 추출하기 위한 목록 이해도를 찾습니다.(리스트, 세트, 튜플 및 다음을 정의하는 모든 항목에 적용됨__contains__또는__getitem__).

if 5 in [data.n for data in myList]:
    print "Found it"

참고 항목:

다른 방법으로 다음() 함수를 사용할 수 있습니다.

matched_obj = next(x for x in list if x.n == 10)

다음을 추가해야 합니다.__eq__그리고 a__hash__너에게 메소드Data수업, 그것은 확인할 수 있습니다.__dict__속성이 동일한 경우(동일한 속성) 값도 동일합니다.

만약 그랬다면, 당신은

test = Data()
test.n = 5

found = test in myList

in키워드 확인 여부test안에 있습니다.myList.

만약 당신이 단지 a를 원한다면.n의 재산.Data다음을 사용할 수 있습니다.

class Data(object):
    __slots__ = ['n']
    def __init__(self, n):
        self.n = n
    def __eq__(self, other):
        if not isinstance(other, Data):
            return False
        if self.n != other.n:
            return False
        return True
    def __hash__(self):
        return self.n

    myList = [ Data(1), Data(2), Data(3) ]
    Data(2) in myList  #==> True
    Data(5) in myList  #==> False

사전 사용을 고려해 보십시오.

myDict = {}

for i in range(20):
    myDict[i] = i * i

print(5 in myDict)

다음 목록 이해를 다음 목록과 함께 사용합니다.index방법:

data_n = 30
j = [data.n for data in mylist].index(data_n)
print(mylist[j].data.n == data_n)

하나의 항목만 일치한다는 답변이 없다는 것이 놀랍습니다.

아마도 이것은 그렇게 할 것입니다.

def one_matching(list, test):
  filtered = [item for item in list if test(item)]
  if len(filtered) != 1:
    if len(filtered) == 0:
      raise KeyError("No matching value found.")
    else:
      raise KeyError("Multiple matching values found.", *filtered)
  return filtered[0] 

# prints 2:
print(one_matching([1,2,3], lambda x: x**2 == 4))

언급URL : https://stackoverflow.com/questions/598398/searching-a-list-of-objects-in-python

반응형