나는 다음과 같은 것을하고 싶다 :
foo = {'foo':1,'zip':2,'zam':3,'bar':4}
if ("foo","bar") in foo:
#do stuff
'foo'와 'bar'가 dict foo에 있는지 어떻게 확인합니까?
나는 다음과 같은 것을하고 싶다 :
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!
set
우수하다. 평소와 같이 ... 측정 해보세요!-)
if {"foo", "bar"} <= myDict.keys(): ...
여전히 Python 2를 사용하고 있다면 할 수 있습니다
if {"foo", "bar"} <= myDict.viewkeys(): ...
당신이 아직도 있다면 정말 오래된 파이썬 <= 2.6, 당신은 호출 할 수 있습니다 set
DICT에 있지만 세트를 구축 할 수있는 전체 DICT를 반복 것이고, 그 느린 :
if set(("foo", "bar")) <= set(myDict): ...
set(("foo","bar")) <= myDict.keys()
임시 세트를 피할 수 있으므로 훨씬 빠릅니다. 내 테스트의 경우 쿼리가 10 개 항목 일 때 모두 사용하는 속도와 거의 같습니다. 쿼리가 커질수록 속도가 느려집니다.
if {'foo', 'bar'} <= set(myDict): ...
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
d.viewkeys()
만들어야한다 set(q) <= d.viewkeys()
.
Python 2.7.5
이 d.keys()
역시 방법.
set(q) <= ...
TypeError: can only compare to a set
. 죄송합니다! :))
d.viewkeys() >= set(q)
. 주문이 왜 중요한지 알아 보려고 여기에 왔습니다!
왼쪽을 세트로 감쌀 필요는 없습니다. 당신은 이것을 할 수 있습니다 :
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
set(d)
set(d.keys())
( d.keys()
구성 하는 중간 목록없이) 와 동일
Alex Martelli의 답변이 마음에 들지만 Pythonic처럼 보이지 않습니다. 즉, 나는 Pythonic이라는 중요한 부분을 쉽게 이해할 수 있다고 생각했습니다. 그 목표로<=
로 이해하기 쉽지 않습니다.
issubset()
Karl Voigtland의 답변에서 제안한대로 더 많은 문자를 사용 하는 것이 더 이해하기 쉽습니다. 이 방법은 사전을 인수로 사용할 수 있으므로 짧고 이해하기 쉬운 해결책은 다음과 같습니다.
foo = {'foo': 1, 'zip': 2, 'zam': 3, 'bar': 4}
if set(('foo', 'bar')).issubset(foo):
#do stuff
{'foo', 'bar'}
대신 에을 (를) 사용하고 싶습니다 set(('foo', 'bar'))
. 그러나 이해할 수 없으며 괄호가 사전처럼 너무 쉽게 혼란스럽게 생각합니다.
Alex Martelli의 솔루션 set(queries) <= set(my_dict)
은 가장 짧은 코드이지만 가장 빠를 수는 없습니다. Q = len (쿼리) 및 D = len (my_dict)이라고 가정하십시오.
파이썬이 세트 설정을 가정 할 때 O (Q) + O (D)를 사용하여 두 세트를 만든 다음 O (min (Q, D)) 만 하위 집합 테스트를 수행합니다. is O (1)-최악의 경우입니다 (답이 True 인 경우).
휴드 브라운의 생성자 솔루션 (et al?) all(k in my_dict for k in queries)
은 최악의 경우 O (Q)입니다.
복잡한 요소 :
(1) 세트 기반 가제트의 루프는 모두 C- 속도로 수행되는 반면, 모든 기반 가제트는 바이트 코드를 통해 반복됩니다.
(2) 임의의 가젯의 호출자는 그에 따라 쿼리 항목을 주문하는데 실패 할 확률에 대한 임의의 지식을 사용할 수있는 반면, 세트 기반 가젯은 그러한 제어를 허용하지 않을 수있다.
항상 그렇듯이 속도가 중요하다면 운영 조건 하에서 벤치마킹하는 것이 좋습니다.
.issubset () 도 사용할 수 있습니다
>>> {"key1", "key2"}.issubset({"key1":1, "key2":2, "key3": 3})
True
>>> {"key4", "key2"}.issubset({"key1":1, "key2":2, "key3": 3})
False
>>>
람다를 사용하는 것은 어떻습니까?
if reduce( (lambda x, y: x and foo.has_key(y) ), [ True, "foo", "bar"] ): # do stuff
>>> if 'foo' in foo and 'bar' in foo:
... print 'yes'
...
yes
Jason은 () 파이썬에서 필요하지 않습니다.
이걸로 가져 가면 주어진 모든 옵션을 쉽게 이해할 수있는 두 가지 방법이 있습니다. 그래서 내 주요 기준은 매우 빠른 코드가 아니라 읽을 수있는 코드가 있습니다. 코드를 이해하기 쉽게하려면 주어진 가능성을 선호합니다.
"var <= var2.keys ()"가 아래 테스트에서 더 빠르게 실행된다는 사실은 이것을 선호합니다.
import timeit
timeit.timeit('var <= var2.keys()', setup='var={"managed_ip", "hostname", "fqdn"}; var2= {"zone": "test-domain1.var23.com", "hostname": "bakje", "api_client_ip": "127.0.0.1", "request_data": "", "request_method": "GET", "request_url": "hvar2p://127.0.0.1:5000/test-domain1.var23.com/bakje", "utc_datetime": "04-Apr-2019 07:01:10", "fqdn": "bakje.test-domain1.var23.com"}; var={"managed_ip", "hostname", "fqdn"}')
0.1745898080000643
timeit.timeit('var.issubset(var2)', setup='var={"managed_ip", "hostname", "fqdn"}; var2= {"zone": "test-domain1.var23.com", "hostname": "bakje", "api_client_ip": "127.0.0.1", "request_data": "", "request_method": "GET", "request_url": "hvar2p://127.0.0.1:5000/test-domain1.var23.com/bakje", "utc_datetime": "04-Apr-2019 07:01:10", "fqdn": "bakje.test-domain1.var23.com"}; var={"managed_ip", "hostname", "fqdn"};')
0.2644960229999924
>>> ok
{'five': '5', 'two': '2', 'one': '1'}
>>> if ('two' and 'one' and 'five') in ok:
... print "cool"
...
cool
이것은 작동하는 것 같습니다
()
먼저 평가 될 것이라고 의심 하고 결과 True
를 확인합니다 True in ok
. 실제로 어떻게 작동합니까?!