如何快速查单?
How to fast check list?
假设我有如下列表:
a = ['111', '222', '3334', '12']
当我只检查一个元素时,超过或少于 3 个长度,它会 return 错误并停止检测。
这是我的方法:
for b in a:
if len(b) != 3:
return False
但是应该有更好的方法,怎么办?
用于与any
和all
讨论性能。 sureshv 提到 any
优于 all
但我使用 timeit
证明 all
优于 any
。但是,not all(...)
可以忽略,not
对性能来说是昂贵的。
from timeit import timeit
print timeit('any(len(x) != 3 for x in ["111", "222", "3334", "12", "111", "222" , "111", "222" , "111", "222"])', number=100000)
print timeit('all(len(b) == 3 for b in ["111", "222", "3334", "12", "111", "222" , "111", "222" , "111", "222"])', number=100000)
print timeit('not all(len(b) == 3 for b in ["111", "222", "3334", "12", "111", "222" , "111", "222" , "111", "222"])', number=100000)
>>>first
0.0830238555881
0.0820391147939
0.0863792158681
>>>second
0.0826572149797
0.0818332714663
0.0830155876428
>>>third
0.0836901379378
0.0809026999688
0.0812479579601
我想你在找:
if any(len(x) != 3 for x in a):
return False
您可以使用所有 -
def check_element(a):
return all(len(b) == 3 for b in a)
或常规使用 lambda
def check_element(a):
return not bool(list(filter(lambda b: b != 3, a)))
虽然第一种方法更符合 Python 风格,但这是您应该采用的方法。
假设我有如下列表:
a = ['111', '222', '3334', '12']
当我只检查一个元素时,超过或少于 3 个长度,它会 return 错误并停止检测。
这是我的方法:
for b in a:
if len(b) != 3:
return False
但是应该有更好的方法,怎么办?
用于与any
和all
讨论性能。 sureshv 提到 any
优于 all
但我使用 timeit
证明 all
优于 any
。但是,not all(...)
可以忽略,not
对性能来说是昂贵的。
from timeit import timeit
print timeit('any(len(x) != 3 for x in ["111", "222", "3334", "12", "111", "222" , "111", "222" , "111", "222"])', number=100000)
print timeit('all(len(b) == 3 for b in ["111", "222", "3334", "12", "111", "222" , "111", "222" , "111", "222"])', number=100000)
print timeit('not all(len(b) == 3 for b in ["111", "222", "3334", "12", "111", "222" , "111", "222" , "111", "222"])', number=100000)
>>>first
0.0830238555881
0.0820391147939
0.0863792158681
>>>second
0.0826572149797
0.0818332714663
0.0830155876428
>>>third
0.0836901379378
0.0809026999688
0.0812479579601
我想你在找:
if any(len(x) != 3 for x in a):
return False
您可以使用所有 -
def check_element(a):
return all(len(b) == 3 for b in a)
或常规使用 lambda
def check_element(a):
return not bool(list(filter(lambda b: b != 3, a)))
虽然第一种方法更符合 Python 风格,但这是您应该采用的方法。