programing

1개의 패스로 여러 개의 키가 입력되어 있는지 확인하려면 어떻게 해야 합니까?

yoursource 2022. 9. 23. 21:49
반응형

1개의 패스로 여러 개의 키가 입력되어 있는지 확인하려면 어떻게 해야 합니까?

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

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

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

양쪽이 모두 기능하고 있는지 어떤지는 어떻게 확인할 수 있습니까?foo그리고.bardict로 되어 있다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(): ...

여전히 매우 오래된 Python <= 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

힌트:

안쪽에 대괄호 사용all()목록을 이해하려면:

if all([key in foo for key in ["foo","bar"]]):

불필요할 뿐만 아니라, 확실히 해롭습니다.이것은 정상적인 단락 동작을 방해하기 때문입니다.all().

나는 알렉스 마르텔리의 대답을 좋아하지만, 내가 보기에 그것은 피토닉처럼 보이지 않는다.즉, 나는 피토닉이 되는 것의 중요한 부분은 쉽게 이해할 수 있는 것이라고 생각했다.그 목표를 가지고<=이해하기 쉽지 않아요.

글자 수가 많은 반면issubset()칼 보이트랜드의 답변이 더 이해하기 쉽다는 것이다.이 방법은 사전을 인수로 사용할 수 있기 때문에 이해하기 쉬운 간단한 해결책은 다음과 같습니다.

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

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

사용하고 싶습니다{'foo', 'bar'}대신해서set(('foo', 'bar'))그게 더 짧으니까.하지만, 그렇게 이해할 수 없고 교정기가 사전처럼 너무 쉽게 헷갈린다고 생각해요.

나는 이것이 가장 똑똑하고 간결하다고 생각한다.

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

dict에 모든 키가 있는지 확인합니다.

{'key_1', 'key_2', 'key_3'} <= set(my_dict)

dict에 하나 이상의 키가 있는지 확인합니다.

{'key_1', 'key_2', 'key_3'} & set(my_dict)

알렉스 마르텔리의 해법set(queries) <= set(my_dict)가장 짧은 코드이지만 가장 빠르지 않을 수 있습니다.Q = len(1900) 및 D = len(my_filen)을 가정합니다.

이것은 2개의 세트를 작성하기 위해서 O(Q)+O(D)가 필요합니다.그리고 (1개의 희망은) O(min(Q,D)만이 서브셋테스트를 실행합니다.물론 Python set look-up이 O(1)라고 가정합니다.이것은 최악의 경우입니다(응답이 True인 경우).

hughdbrown의 발전기 솔루션(등) 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
>>>

짧고 달콤한

{"key1", "key2"} <= {*dict_name}

람다를 써보는 건 어때요?

 if reduce( (lambda x, y: x and foo.has_key(y) ), [ True, "foo", "bar"] ): # do stuff

원하는 경우:

  • 키 값도 가져옵니다.
  • 두 개 이상의 사전을 체크하다

그 후, 다음과 같이 합니다.

from operator import itemgetter
foo = {'foo':1,'zip':2,'zam':3,'bar':4}
keys = ("foo","bar") 
getter = itemgetter(*keys) # returns all values
try:
    values = getter(foo)
except KeyError:
    # not both keys exist
    pass

생각지도 못한 일이라는 건 아니지만 보통 가장 간단한 것이 가장 좋습니다.

if ("foo" in foo) and ("bar" in foo):
    # do stuff
>>> if 'foo' in foo and 'bar' in foo:
...     print 'yes'
... 
yes

Jason, ()는 Python에서는 필요하지 않습니다.

이에 대한 제 견해만 말씀드리면, 모든 옵션을 이해하기 쉬운 두 가지 방법이 있습니다.그래서 저의 주요 기준은 매우 읽기 쉬운 코드입니다. 예외적으로 빠른 코드는 아닙니다.코드를 이해하기 쉽게 하기 위해 주어진 가능성을 선호합니다.

  • var <= var2.keys()
  • var.issubset(var2)

아래 테스트에서는 "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

일부 키만 일치하는지 여부를 판별하는 경우 다음과 같이 동작합니다.

any_keys_i_seek = ["key1", "key2", "key3"]

if set(my_dict).intersection(any_keys_i_seek):
    # code_here
    pass

또한 일부 키만 일치하는 경우 다음 옵션을 찾을 수 있습니다.

any_keys_i_seek = ["key1", "key2", "key3"]

if any_keys_i_seek & my_dict.keys():
    # code_here
    pass

모든 키가 딕트 형식인지 아닌지를 검출하기 위한 또 다른 옵션:

dict_to_test = { ... }  # dict
keys_sought = { "key_sought_1", "key_sought_2", "key_sought_3" }  # set

if keys_sought & dict_to_test.keys() == keys_sought: 
    # True -- dict_to_test contains all keys in keys_sought
    # code_here
    pass

여기 일치하지 않는 아이템을 입수하고 싶은 경우의 대체 솔루션이 있습니다.

not_existing_keys = [item for item in ["foo","bar"] if item not in foo]
if not_existing_keys:
  log.error('These items are missing', not_existing_keys)
my_dict = {
    'name': 'Askavy',
    'country': 'India',
    'age': 30
}

if set(('name', 'country','age')).issubset(my_dict.keys()):
     print("All keys are present in the dictionary") 
else: 
    print("All keys are not present in  the dictionary") 

] 키를 에 두고 [None]를 할 수 .pydash 참조

import pydash as _
_.get(d, 'key1.key2.key3.whatevermaybeNone.inthemiddle', default=None) )
>>> ok
{'five': '5', 'two': '2', 'one': '1'}

>>> if ('two' and 'one' and 'five') in ok:
...   print "cool"
... 
cool

이것은 효과가 있는 것 같다.

언급URL : https://stackoverflow.com/questions/1285911/how-do-i-check-that-multiple-keys-are-in-a-dict-in-a-single-pass

반응형