2011-04-13 4 views
2

인스턴스 목록이 주어진다면 clients 단일 인스턴스 변수 screenName의 값을 기반으로 목록에서 항목을 뽑으려고합니다. 나는 이것을 할 수 있다는 것을 안다 :인스턴스 변수를 기반으로 목록에서 파이썬 인스턴스를 가져옵니다.

for client in clients: 
    if client.screenName = search: 
    return client 

그러나 루프없이 이것을 할 수있는 더 좋은 방법이 있는가? 이것에 대한 사전을 사용하여 도움 :

+2

나는 당신이 client.screen == 검색 –

답변

6

당신은 당신은 generator expression,

client=next(client for client in clients if client.screenName == search) 

를 사용할 수 있지만, 당신은 여전히 ​​다른 방법으로, 반복하지 않는 것이 filter

try: 
    filter(lambda client: client.screenName == search, clients)[0] 
except IndexError: 
    # handle error. May be use a default value 
+0

클라이언트의 ** no ** 클라이언트에'screenName == search'가 있으면'IndexError'를 발생시키지 않습니까? ... – neurino

+0

@neurino 예외가 처리 될 것이라고 생각합니다. 그러나 완전을 기하기 위해'try-except' 블록을 추가했습니다. –

+0

나는'[0]'을 제거하고 결과 목록을 반환하기 만하면됩니다. 결국 하나 이상의 일치가있을 수 있다면 첫 번째가 필요하면 ... – neurino

0

에 대한

감사합니다 :

이 가정 :

d[screeName] = client 

그냥이 작업을 수행 할 수 있습니다

return d[search] 
0

clients 인 경우 dict 다음은만 사용할 수 있습니다. 10. 목록의 요소 순서가 중요한 경우 을 collections에서 사용할 수 있습니다.

1

list comprehensions을 사용합니다. 이 당신의 Client 클래스입니다 가정 :

>>> [e for e in l if e.screenName == 'b'] 
[<__main__.Client instance at 0x2e52b0>] 
:

>>> l = [Client('a'), Client('b'), Client('c')] 

... 나는 주어진 이름 만 클라이언트를 포함하는 목록을 얻을 수 있습니다 : 나는 고객의 목록을 가지고있는 경우

>>> class Client: 
... def __init__(self, screenName): 
...  self.screenName = screenName 

이제 첫 번째 요소와 가정 요소 만 가져옵니다.

>>> [e for e in l if e.screenName == 'b'][0] 
<__main__.Client instance at 0x2e52b0> 
>>> c = [e for e in l if e.screenName == 'b'][0] 
>>> c.screenName 
'b' 

이것은 매우 짧고 IMHO 우아하지만 목록 이해력이 모든 목록에서 반복되므로 효율성이 떨어질 수 있습니다. 이 오버 헤드를 피하기 위해 원하는 경우, 대괄호 대신 괄호를 사용하여 발전기 대신 새 목록을 얻을 수 있습니다 :

>>> g = (e for e in l if e.screenName == 'b') 
>>> g 
<generator object <genexpr> at 0x2e5440> 
>>> g.next() 
<__main__.Client instance at 0x2e52b0> 

그러나, next() 방법은 한 번만 호출 할 수 있습니다.

HTH!

+0

을 의미한다고 생각합니다. 매우 간결하고 좋습니다. 같은 screenName 가진 여러 개체를 포함하는 경우 next() 여러 번 호출 할 수 있습니다 가정합니다. – Daniel

1

를 사용할 수 있습니다.

참고 : 클라이언트가 조건 client.screenName == search을 충족시키지 않으면 위의 경우 StopIteration 예외가 발생합니다. 이것은 아무것도 반환하지 않고 루프에서 빠져 나오는 for-loop과 다릅니다.

상황에 따라 예외 발생은 자동으로 실패하는 것보다 낫습니다.당신이 대신 StopIteration 예외의 기본값을 원하지 않는 경우

는, 당신은 next의 2 매개 변수 버전을 사용할 수 있습니다 :이 주제의

최저 토론이 link

return find(lambda client: client.screenName == search, clients) 

client=next(client for client in clients if client.screenName == search, 
      default_value) 
0

이렇게하면 다음과 같이 모든 유형의 목록에 사용할 수있는 일반 찾기 기능을 정의해야합니다.

def find(f, seq): 
    """Return first item in sequence where f(item) == True.""" 
    for item in seq: 
    if f(item): 
     return item 
+0

's/find/filter /'를 의미하는 것 같습니까? –

+0

아니, 내가 쓴 걸 의미하지 않는다 downvote. 여기를 참조하십시오 : http://tomayko.com/writings/cleanest-python-find-in-list-function – Yasser

+0

잘 대답을 정의해야합니다. – Ant

관련 문제