사전에 값이 있는지 확인하는 방법 (python)


251

파이썬에는 다음과 같은 사전이 있습니다.

d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}

이 사전에 "1"또는 "2"와 같은 값이 있는지 확인하는 방법이 필요합니다.

예를 들어, 색인 "1"이 존재하는지 알고 싶다면 간단히 입력하면됩니다.

"1" in d

그리고 파이썬은 그것이 사실인지 거짓인지 말해 줄 것이지만, 값이 존재하는지 알아내는 것을 제외하고는 똑같은 일을해야합니다.

답변:


381
>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> 'one' in d.values()
True

호기심에서 일부 비교 타이밍 :

>>> T(lambda : 'one' in d.itervalues()).repeat()
[0.28107285499572754, 0.29107213020324707, 0.27941107749938965]
>>> T(lambda : 'one' in d.values()).repeat()
[0.38303399085998535, 0.37257885932922363, 0.37096405029296875]
>>> T(lambda : 'one' in d.viewvalues()).repeat()
[0.32004380226135254, 0.31716084480285645, 0.3171098232269287]

편집 : 그리고 왜 궁금한 경우 ... 이유는 위의 각 객체가 다른 유형의 객체를 반환하기 때문에 조회 작업에 적합하지 않을 수도 있습니다.

>>> type(d.viewvalues())
<type 'dict_values'>
>>> type(d.values())
<type 'list'>
>>> type(d.itervalues())
<type 'dictionary-valueiterator'>

EDIT2 : 의견의 요청에 따라 ...

>>> T(lambda : 'four' in d.itervalues()).repeat()
[0.41178202629089355, 0.3959040641784668, 0.3970959186553955]
>>> T(lambda : 'four' in d.values()).repeat()
[0.4631338119506836, 0.43541407585144043, 0.4359898567199707]
>>> T(lambda : 'four' in d.viewvalues()).repeat()
[0.43414998054504395, 0.4213531017303467, 0.41684913635253906]

나는 파이썬을 가지고 있지 않다. 'one'대신 'four'로 테스트를 다시 실행할 수 있습니까?
soulcheck

2
더 큰 dict에서 실행되지 않는 한, 그것은 결코 필요하지 않았습니다. 값 목록을 복사하고 뷰 값을 유지하여 viewvalues ​​()에서 값 ()의 ​​오버 헤드가 발생한다고 생각합니다.
soulcheck

의 크기가 작 으면 d타이밍이 사실상 의미가 없습니다. 파이썬 3에서, dict.values()기본적으로 사전보기이며, dict.itervalues()그리고 dict.viewvalues()사라 졌어요. 이것을 더 큰 사전으로 다시 테스트 list(d.values())하고 Python 2 동작 iter(d.values())을 얻고 dict.itervalues()동작 을 얻는 데 사용할 수 있지만 두 버전 모두 전역 조회 및 호출이 필요하기 때문에 속도가 느려집니다. 둘 다 필요하지 않은 추가 작업을 수행합니다.
Martijn Pieters

33

당신이 사용할 수있는

"one" in d.itervalues()

"one"사전 값 중 하나 인지 테스트합니다 .


23

파이썬 사전에는 get (key) funcion이 있습니다.

>>> d.get(key)

예를 들어

>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> d.get('3')
'three'
>>> d.get('10')
none

키가 존재하지 않으면 none값 을 반환 합니다.

foo = d[key] # raise error if key doesn't exist
foo = d.get(key) # return none if key doesn't exist

3.0 미만 및 5.0 이상의 버전과 관련된 내용. .


29
질문에 대답하지 않습니다. OP는 key:value키가 아닌 값을 묻습니다 .
akshaynagpal

10

사전보기를 사용하십시오.

if x in d.viewvalues():
    dosomething()..

4

값을 확인하는 다른 유형이 존재합니다.

d = {"key1":"value1", "key2":"value2"}
"value10" in d.values() 
>> False

값 목록 인 경우

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6']}
"value4" in [x for v in test.values() for x in v]
>>True

문자열 값이있는 값 목록은 어떻게됩니까?

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6'], 'key5':'value10'}
values = test.values()
"value10" in [x for v in test.values() for x in v] or 'value10' in values
>>True

사용하지 마십시오 value in [... list comprehension over sequence ...], 사용 any(value in sequence ...)가치가 발견되었을 때 다른 작업 및 단락 회로에 사용하지 않는리스트 객체를 생성 방지하기 위해.
Martijn Pieters

0

파이썬 3에서는 values()사전 기능을 사용할 수 있습니다 . 값의 뷰 객체를 반환합니다. 이것은 차례로 iter반복자 객체를 반환하는 함수 로 전달 될 수 있습니다 . 반복자를 다음 in과 같이 사용하여 확인할 수 있습니다 .

'one' in iter(d.values())

또는 뷰 객체가 목록과 유사하기 때문에 직접 사용할 수 있습니다

'one' in d.values()

1
딕셔너리 뷰 에서의 사용 에는 아무런 의미없습니다iter() . in이미 객체를 반복 가능으로 사용합니다 (유형은 전용 __contains__메소드를 구현하지 않습니다 ). 유일한 차이점 'one' in iter(d.values())'one in d.values()파이썬은 추가 작업 (대한 글로벌 조회의 비용을 지불 할 만든 것입니다 iter).
Martijn Pieters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.