Python은 키 목록이 사전에 있는지 확인합니다.


87

다음과 같은 사전이 있습니다.

grades = {
        'alex' : 11,
        'bob'  : 10,
        'john' : 14,
        'peter': 7
       }

및 이름 목록 students = ('alex', 'john')

의 모든 이름 studentsgradesdict의 키로 존재 하는지 확인해야합니다 .

grades더 많은 이름을 가질 수 있지만의 모든 이름 studentsgrades

그것을 할 수있는 간단한 방법이 있어야하지만 여전히 파이썬에 익숙하지 않아 알아낼 수 없습니다. 시도했지만 if students in grades작동하지 않았습니다.

실제 경우에는 목록이 훨씬 더 커질 것입니다.


답변:


195

사용 all():

if all(name in grades for name in students):
    # whatever

큰! 조건이 False 인 경우 dic에서 누락 된 요소를 가져 오는 지름길이 있습니까?
guival

2
@guival 그래, 당신은 세트 작업, 예를 사용할 수 있습니다 set(students) - grades.keys()파이썬 3에서
스벤 Marnach

키 목록 중 문자열의 하위 문자열인지 확인하는 방법이 있습니까?
조나단

@Jonathan 무슨 뜻인지 잘 모르 any(k in my_string for k in keys)시겠습니까?
Sven Marnach

@SvenMarnach가 방금 any ()를 발견했습니다! 그게 바로 내가 찾던 것입니다 :)
Jonathan

22
>>> grades = {
        'alex' : 11,
        'bob'  : 10,
        'john' : 14,
        'peter': 7
}
>>> names = ('alex', 'john')
>>> set(names).issubset(grades)
True
>>> names = ('ben', 'tom')
>>> set(names).issubset(grades)
False

그것을 호출하는 class것은 유효하지 않으므로 names.


이는 all(). 항상 O (m + n)은, 여기서 m과 n은 각각의 크기가있는 것 namesgrades. 사용 all()은 O (m)이며 단축 될 수 있습니다.
Sven Marnach

7
@SvenMarnach 맞아, 다른 접근 방식이기 때문에 여기에 남겨 둘 것이지만 당신의 것이 최고라는 데 동의합니다.
jamylak 2012-06-12

확실히 여기에 두십시오! 어쨌든 흥미로운 접근 방식입니다.
Sven Marnach

3

학생들을 세트로 가정

if not (students - grades.keys()):
    print("All keys exist")

설정으로 변환하지 않으면

if not (set(students) - grades.keys()):
    print("All keys exist")

0

딕셔너리에 여러 키가 있는지 테스트 할 수 있습니다 <dict>.keys().set .

코드에서이 논리는 ...

if 'foo' in d and 'bar' in d and 'baz' in d:
    do_something()

다음과 같이 더 간략하게 표현할 수 있습니다.

if {'foo', 'bar', 'baz'} <= d.keys():
    do_something()

그만큼 <=왼쪽 설정 여부에 대한 테스트 세트에 대한 연산자가 오른쪽 집합의 부분 집합이다. 이것을 쓰는 또 다른 방법은<set>.issubset(other) .

세트에서 지원하는 다른 흥미로운 작업이 있습니다. https://docs.python.org/3.8/library/stdtypes.html#set

이 트릭을 사용하면 위의 첫 번째 예에서와 같이 여러 키를 확인하는 코드의 많은 부분을 압축 할 수 있습니다.

다음을 사용하여 전체 키 목록을 확인할 수도 있습니다 <=.

if set(students) <= grades.keys():
    print("All studends listed have grades in your class.")

# or using unpacking - which is actually faster than using set()
if {*students} <= grades.keys():
    ...

또는 students또한 dict 인 경우 :

if students.keys() <= grades.keys():
    ...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.