としては、あなたがin
演算子を使用することができますlists
またはsets
のいずれかでメンバーシップを確認してください。たとえば、
found = x in some_list
if found:
#do stuff
else:
#other stuff
ただし、スピードが問題であると述べました。 TL; DR-sets
は、set
がすでに存在する場合は高速です。 https://wiki.python.org/moin/TimeComplexityからin
演算子を使用してメンバーシップをチェックすると、list
の場合はO(n)、set
の場合はO(1)(@enderlandのように指摘されます)です。
100,000アイテム、または1回のみのチェックでは、使用する違いはほとんどありませんが、多くのチェックを行うアイテムや状況が多い場合は、おそらくset
を使用します。私は通訳からテストのカップルを行なったし、これは私が(Pythonの2.7、i3のWindowsの10 64ビット)見つけたものです:100万のエントリの場合
import timeit
#Case 1: Timing includes building the list/set
def build_and_check_a_list(n):
a_list = [ '/'.join(('http:stackoverflow.com',str(i))) for i in xrange(1,n+1) ]
check = '/'.join(('http:stackoverflow.com',str(n)))
found = check in a_list
return (a_list, found)
def build_and_check_a_set(n):
a_set = set([ '/'.join(('http:stackoverflow.com',str(i))) for i in xrange(1,n+1) ])
check = '/'.join(('http:stackoverflow.com',str(n)))
found = check in a_set
return (a_set, found)
timeit.timeit('a_list, found = build_and_check_a_list(100000)', 'from __main__ import build_and_check_a_list', number=50)
3.211972302022332
timeit.timeit('a_set, found = build_and_check_a_set(100000)', 'from __main__ import build_and_check_a_set', number=50)
4.5497120006930345
#Case 2: The list/set already exists (timing excludes list/set creation)
check = '/'.join(('http:stackoverflow.com',str(100000)))
timeit.timeit('found = check in a_list', 'from __main__ import a_list, check', number=50)
0.12173540635194513
timeit.timeit('found = check in a_set', 'from __main__ import a_set, check', number=50)
1.01052391983103e-05
、構築および/または自分のコンピュータ上でメンバーシップを確認するには:
#Case 1: list/set creation included
timeit.timeit('a_list, found = build_and_check_a_list(1000000)', 'from __main__ import build_and_check_a_list', number=50)
35.71641090788398
timeit.timeit('a_set, found = build_and_check_a_set(1000000)', 'from __main__ import build_and_check_a_set', number=50)
51.41244436103625
#Case 2: list/set already exists
check = '/'.join(('http:stackoverflow.com',str(1000000)))
timeit.timeit('found = check in a_list', 'from __main__ import a_list, check', number=50)
1.3113457772124093
timeit.timeit('found = check in a_set', 'from __main__ import a_set, check', number=50)
8.180430086213164e-06