Python kiểm tra xem danh sách các khóa có tồn tại trong từ điển hay không


87

Tôi có một từ điển giống như thế này:

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

và một danh sách tên students = ('alex', 'john')

Tôi cần kiểm tra xem tất cả các tên studentstồn tại dưới dạng khóa trong gradesdict.

gradescó thể có nhiều tên hơn, nhưng tất cả các tên studentstronggrades

Phải có một cách đơn giản để làm điều đó, nhưng tôi vẫn chưa quen với python và không thể tìm ra nó. đã thử if students in grades, không hoạt động.

Trong trường hợp thực tế, danh sách sẽ lớn hơn nhiều.


Câu trả lời:


195

Sử dụng all():

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

Tuyệt quá! Bất kỳ cách tắt nào để lấy các phần tử bị thiếu từ dic nếu điều kiện là Sai?
guival

2
@guival Yup, bạn có thể sử dụng thiết lập hoạt động, ví dụ như set(students) - grades.keys()bằng Python 3.
Sven Marnach

có cách nào để kiểm tra xem có bất kỳ khóa nào trong danh sách là một chuỗi con trong một chuỗi không?
Jonathan

@Jonathan Không chắc ý bạn là gì, có thể any(k in my_string for k in keys)không?
Sven Marnach

@SvenMarnach vừa phát hiện ra bất kỳ () nào! Đó chính xác là những gì tôi đang tìm kiếm :)
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

Gọi nó classlà không hợp lệ nên tôi đã đổi nó thành names.


Điều này không thể cắt ngắn, ngược lại all(). Nó sẽ luôn là O (m + n), trong đó m và n là kích thước tương ứng của namesgrades. Sử dụng all()sẽ là O (m), và có thể cắt ngắn.
Sven Marnach

7
@SvenMarnach Đúng vậy, tôi sẽ chỉ để nó ở đây vì nó là một cách tiếp cận khác nhưng tôi đồng ý rằng của bạn là tốt nhất.
jamylak

Chắc chắn để nó ở đây! Đó là một cách tiếp cận thú vị trong mọi trường hợp.
Sven Marnach

3

Giả sử học sinh như thiết lập

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

Nếu không chuyển đổi nó thành thiết lập

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

0

Bạn có thể kiểm tra xem một số khóa có nằm trong một câu lệnh hay không bằng cách tận dụng lợi thế mà <dict>.keys()trả về a set.

Logic này trong mã ...

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

có thể được trình bày ngắn gọn hơn là:

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

Các <=nhà điều hành cho kiểm tra bộ cho dù các thiết lập bên trái là một tập hợp con của tập ở bên phải. Một cách khác để viết điều này sẽ là <set>.issubset(other).

Có các hoạt động thú vị khác được hỗ trợ bởi các bộ: https://docs.python.org/3.8/library/stdtypes.html#set

Sử dụng thủ thuật này có thể cô đọng rất nhiều vị trí trong mã kiểm tra một số khóa như trong ví dụ đầu tiên ở trên.

Toàn bộ danh sách các khóa cũng có thể được kiểm tra để sử dụng <=:

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():
    ...

Hoặc nếu studentscũng là một mệnh lệnh:

if students.keys() <= grades.keys():
    ...
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.