데이터 요소를 보유하기 위해 C 스타일 구조체와 유사하게 작동하는 간단한 클래스를 생성한다고 가정 해 보겠습니다. 특정 값과 동일한 속성을 가진 개체에 대한 개체 목록을 검색하는 방법을 알아 내려고합니다. 아래는 내가하려는 작업을 설명하는 간단한 예입니다.
예를 들면 :
class Data:
pass
myList = []
for i in range(20):
data = Data()
data.n = i
data.n_squared = i * i
myList.append(data)
n == 5 인 요소가 포함되어 있는지 확인하기 위해 myList 목록을 검색하는 방법은 무엇입니까?
저는 파이썬 문서를 검색하고 검색해 왔으며 목록 이해력으로 이것을 할 수 있다고 생각하지만 확실하지 않습니다. 그런데 Python 2.4.3을 사용해야하므로 새로운 gee-whiz 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)
any()
다음과 같이 정의 된 Python 내장 기능을 사용합니다 .
any (iterable) iterable의
->
요소가 true이면 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)
답변
답변
클래스에 __eq__
및 __hash__
메서드를 추가해야 Data
합니다.__dict__
속성이 같은지 (동일한 속성) 값이 같은지 확인할 수 있습니다.
그렇게했다면 다음을 사용할 수 있습니다.
test = Data()
test.n = 5
found = test in myList
in
경우 키워드 검사 test
에myList
.
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