[python] 단일 패스에서 여러 키가 사전에 있는지 어떻게 확인합니까?

나는 다음과 같은 것을하고 싶다 :

foo = {'foo':1,'zip':2,'zam':3,'bar':4}

if ("foo","bar") in foo:
    #do stuff

‘foo’와 ‘bar’가 dict foo에 있는지 어떻게 확인합니까?



답변

글쎄, 당신은 이것을 할 수 있습니다 :

>>> if all (k in foo for k in ("foo","bar")):
...     print "They're there!"
...
They're there!


답변

if {"foo", "bar"} <= myDict.keys(): ...

여전히 Python 2를 사용하고 있다면 할 수 있습니다

if {"foo", "bar"} <= myDict.viewkeys(): ...

당신이 아직도 있다면 정말 오래된 파이썬 <= 2.6, 당신은 호출 할 수 있습니다 setDICT에 있지만 세트를 구축 할 수있는 전체 DICT를 반복 것이고, 그 느린 :

if set(("foo", "bar")) <= set(myDict): ...


답변

3 가지 대안을위한 간단한 벤치마킹 장비.

D와 Q에 대한 자신의 가치를 넣어 라


>>> from timeit import Timer
>>> setup='''from random import randint as R;d=dict((str(R(0,1000000)),R(0,1000000)) for i in range(D));q=dict((str(R(0,1000000)),R(0,1000000)) for i in range(Q));print("looking for %s items in %s"%(len(q),len(d)))'''

>>> Timer('set(q) <= set(d)','D=1000000;Q=100;'+setup).timeit(1)
looking for 100 items in 632499
0.28672504425048828

#This one only works for Python3
>>> Timer('set(q) <= d.keys()','D=1000000;Q=100;'+setup).timeit(1)
looking for 100 items in 632084
2.5987625122070312e-05

>>> Timer('all(k in d for k in q)','D=1000000;Q=100;'+setup).timeit(1)
looking for 100 items in 632219
1.1920928955078125e-05


답변

왼쪽을 세트로 감쌀 필요는 없습니다. 당신은 이것을 할 수 있습니다 :

if {'foo', 'bar'} <= set(some_dict):
    pass

또한 all(k in d...)솔루션 보다 성능이 우수 합니다.


답변

사용 세트:

if set(("foo", "bar")).issubset(foo):
    #do stuff

또는

if set(("foo", "bar")) <= set(foo):
    #do stuff


답변

이건 어때요:

if all([key in foo for key in ["foo","bar"]]):
    # do stuff
    pass


답변

나는 이것이 가장 똑똑하고 비둘기라고 생각합니다.

{'key1','key2'} <= my_dict.keys()