給定一個實例列表,比如clients
我試圖根據單個實例變量screenName
的值從列表中提取項目。我知道我可以這樣做:Python根據實例變量從列表中獲取實例
for client in clients:
if client.screenName = search:
return client
但是,有沒有更好的方式做到這一點沒有循環?
感謝您使用字典這個您的幫助:)
給定一個實例列表,比如clients
我試圖根據單個實例變量screenName
的值從列表中提取項目。我知道我可以這樣做:Python根據實例變量從列表中獲取實例
for client in clients:
if client.screenName = search:
return client
但是,有沒有更好的方式做到這一點沒有循環?
感謝您使用字典這個您的幫助:)
您可以使用filter
try:
filter(lambda client: client.screenName == search, clients)[0]
except IndexError:
# handle error. May be use a default value
:
假設這樣的:
d[screeName] = client
你可以這樣做:
return d[search]
如果clients
是一個dict
然後你可以只使用clients[search]
。如果列表中元素的順序很重要,則可以使用collections
中的OrderedDict
。
我會用list comprehensions。假設這是你的Client
類:
>>> class Client:
... def __init__(self, screenName):
... self.screenName = screenName
如果我的客戶名單:
>>> l = [Client('a'), Client('b'), Client('c')]
...我可以只包含有特定名稱的客戶名單:
>>> [e for e in l if e.screenName == 'b']
[<__main__.Client instance at 0x2e52b0>]
現在,只是得到第一個 - 並且假定只有 - 元素:
>>> [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'
這是非常短暫和恕我直言的優雅,但可能效率較低,因爲列表理解將迭代所有列表。如果你想避免這種開銷,可以使用括號而不是方括號中得到一個發電機,而不是一個新的列表:
>>> 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!
非常簡潔和不錯。我假設如果l包含多個具有相同screenName的對象,可以多次調用next()。 – Daniel 2015-06-15 07:55:04
你可以使用一個generator expression,
client=next(client for client in clients if client.screenName == search)
但不是說你還是循環,只是以不同的方式。
注意:如果沒有客戶滿足條件client.screenName == search
那麼上述將引起StopIteration
例外。這與你的for-loop
不同,它不會返回任何東西而退出循環。
根據你的情況,提出異常可能比靜靜地失敗更好。
如果你不想默認值,而不是StopIteration
例外,那麼你可以使用的next
2參數版本:
client=next(client for client in clients if client.screenName == search,
default_value)
最佳這個話題討論的是對這個link
return find(lambda client: client.screenName == search, clients)
這需要你定義一個通用的查找功能這將對於所有類型的列表像這樣的工作:
def find(f, seq):
"""Return first item in sequence where f(item) == True."""
for item in seq:
if f(item):
return item
我想你的意思是client.screen ==搜索 – 2011-04-13 20:32:41