簡體   English   中英

檢查列表中元素的存在

[英]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文字 - TrueFalse

你可以嘗試any

found = any(p.name == 'Alan' for p in person_list)

打印found會給出TrueFalse

或者你也可以做一個列表理解:

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。

我對mapany方法進行了速度測試:

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方法都更快。

更新

attrgettermap一起使用可達到最佳性能:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM