>>> d = {"foo": 12, "bar": 2, "jim": 4, "bob": 17}
>>> [k for k, v in d.items() if v > 6] # Use d.iteritems() on python 2.x
['bob', 'foo']
Tôi muốn chỉ cập nhật câu trả lời này cũng để giới thiệu những giải pháp bởi @glarrain mà tôi thấy mình có khuynh hướng sử dụng ngày nay.
[k for k in d if d[k] > 6]
này là hoàn toàn tương thích chéo và không đòi hỏi một sự thay đổi khó hiểu từ .iteritems
(.iteritems
tránh tiết kiệm một danh sách để nhớ về Python 2 được cố định bằng Python 3) để .items
.
@ Prof.Falken đề cập đến một giải pháp cho vấn đề này
from six import iteritems
mà hiệu quả sửa chữa các vấn đề tương thích chéo NHƯNG đòi hỏi bạn phải tải về gói six
Tuy nhiên tôi sẽ không hoàn toàn đồng ý với @glarrain rằng giải pháp này có thể đọc được nhiều hơn, đó là cho cuộc tranh luận và có thể chỉ là một sở thích cá nhân mặc dù Python được cho là chỉ có 1 cách để làm điều đó. Theo ý kiến của tôi, điều đó phụ thuộc vào tình huống (ví dụ: bạn có thể có tên từ điển dài mà bạn không muốn nhập hai lần hoặc bạn muốn đặt giá trị cho một tên dễ đọc hơn hoặc một số lý do khác)
Một số thời gian thú vị :
Trong Python 2, giải pháp thứ 2 nhanh hơn, trong Python 3 chúng gần như hoàn toàn bằng nhau ở tốc độ thô.
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.items() if v > 6]'
1000000 loops, best of 3: 0.772 usec per loop
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.iteritems() if v > 6]'
1000000 loops, best of 3: 0.508 usec per loop
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k in d if d[k] > 6]'
1000000 loops, best of 3: 0.45 usec per loop
$ python3 -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.items() if v > 6]'
1000000 loops, best of 3: 1.02 usec per loop
$ python3 -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k in d if d[k] > 6]'
1000000 loops, best of 3: 1.02 usec per loop
Tuy nhiên đây chỉ là những thử nghiệm cho từ điển nhỏ, trong từ điển khổng lồ Tôi khá chắc chắn rằng không có một chìa khóa tra cứu từ điển (d[k]
) sẽ làm cho .items
nhanh hơn nhiều. Và điều này dường như là trường hợp
$ python -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k in d if d[k] > 6]'
1 loops, best of 3: 1.75 sec per loop
$ python -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k, v in d.iteritems() if v > 6]'
1 loops, best of 3: 1.71 sec per loop
$ python3 -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k in d if d[k] > 6]'
1 loops, best of 3: 3.08 sec per loop
$ python3 -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k, v in d.items() if v > 6]'
1 loops, best of 3: 2.47 sec per loop
Tiêu đề của câu hỏi này nên được thay đổi kể từ những gì bạn thực sự muốn đạt được (và các câu trả lời phản ánh điều này) lấy các khóa của các giá trị tương ứng trong một từ điển mà một mệnh đề nhất định là đúng. Một cái gì đó như "Làm thế nào để lọc các khóa từ điển dựa trên các giá trị tương ứng của nó" có thể là một lựa chọn tốt hơn. – glarrain