[英]check existence of element in list
我有一個Person
對象列表,我想根據他們的名字檢查一個人是否存在。 除了這個循環之外,還有更簡單的方法嗎?
class Person:
def __init__(self, name):
self.name = name
found = False
for p in person_list:
if p.name == "Alan":
found = True
break
any(p.name == "Alan" for p in person_list)
它返回一個bool
文字 - True
或False
你可以嘗試any
:
found = any(p.name == 'Alan' for p in person_list)
打印found
會給出True
或False
。
或者你也可以做一個列表理解:
found = not not [p for p in person_list if p.name == 'Alan']
您可以先制作一個名稱列表,然后使用 count 方法:
list(map(lambda x: x.name, person_list)).count('Alan') > 0
如果該人不在列表中,它將返回 False。
我對map
和any
方法進行了速度測試:
names = list(map(str, np.random.randint(0, 10, 1000)))
person_list = [Person(name) for name in names]
%timeit list(map(lambda x: x.name, person_list)).count('Alan') > 0
%timeit any(p.name == 'Alan' for p in person_list)
結果:
207 µs ± 34.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
122 µs ± 17.7 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
所以any
方法都更快。
更新
將attrgetter
與map
一起使用可達到最佳性能:
from operator import attrgetter
f = attrgetter('name')
names = list(map(str, np.random.randint(0, 10, 1000)))
person_list = [Person(name) for name in names]
%timeit list(map(f, person_list)).count('Alan') > 0
%timeit any(f(p) == 'Alan' for p in person_list)
結果:
110 µs ± 18.1 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
172 µs ± 6.08 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.