2010-11-15 32 views
6

Tôi có một dict với cấu trúc sau:Làm cách nào để lọc dict chỉ chọn các khóa lớn hơn giá trị?

{5:"djdj", 6:"8899", 7:"998kdj"} 

Điều quan trọng là int đánh máy và nó không được sắp xếp.

Bây giờ tôi muốn tất cả các yếu tố có khóa> = 6.

Có cách nào dễ dàng để làm điều đó không?

+0

Bạn có muốn một danh sách 'trong đó tất cả các giá trị có khóa trong' dict' lớn hơn hoặc bằng 6? Hoặc bạn có muốn một 'dict' mà không có phím nào thấp hơn 6? – Johnsyweb

Trả lời

15

[v for k,v in mydict.items() if k >= 6]

+0

Câu trả lời hay, ngắn gọn. –

+0

Có hợp pháp không: {k, v cho k, v trong mydict.items() nếu k> = 6} –

+0

@Bin Chen: chúng đang thêm cú pháp đó (sử dụng: thay vì) trong Python 3, nhưng hiện tại , không. http://www.python.org/dev/peps/pep-0274/ – bukzor

0

Bạn có thể sử dụng danh sách hiểu:

mydict = {5:"djdj", 6:"8899", 7:"998kdj"} 
print [k for k in mydict if k >= 6] # prints "[6, 7]" 
print dict([(k, mydict[k]) for k in mydict if k >= 6]) # prints "{6:"8899", 7:"998kdj"}" 
+0

Trong Python 3, bạn có thể thực hiện đọc từ điển, do đó, 'dict ([(k, mydict [k]) cho k trong mydict nếu k> = 6])' có thể trở thành '{k: mydict [k] cho k trong mydict nếu k> = 6]) '. Có lẽ không hữu ích cho trường hợp này, nhưng dù sao mát mẻ :-) –

1
[ mydict[k] for k in filter(lambda x : x > 6, mydict) ] 
+1

yuck, tại sao không 'trong mydict nếu k> 6' thay vì sử dụng bộ lọc? –

0

Danh sách hiểu có vẻ là những gì bạn tìm kiếm nhưng với một danh sách các yếu tố như trái ngược với các phím:

a = {5:"djdj", 6:"8899", 7:"998kdj"} 
[a[elem] for elem in a if elem >= 6] #should give you "['8866', '998kd']" 
8

Bạn có ý nghĩa gì bởi "yếu tố"?

Nếu bạn muốn dict cặp khóa-giá trị có khóa ≥6, Python 2.7+ và 3.x hỗ trợ đọc hiểu dict.

{ k: v for k, v in mydict.items() if k >= 6 } 

Bạn có thể có được điều này trong các phiên bản trước đó của Python

dict((k, v) for k, v in mydict.items() if k >= 6) # Python 2.4+ 
dict([(k, v) for k, v in mydict.items() if k >= 6]) # Python 2.0+ 

bằng cách sử dụng máy phát biểu hoặc comprehensions danh sách.

Nếu bạn muốn có một danh sách chỉ bao phím,

[ k for k in mydict.keys() if k >= 6 ] 
filter(lambda k: k >= 6, mydict.keys()) 

Tương tự, nếu bạn muốn có một danh sách chỉ có giá trị,

[ v for k, v in mydict.items() if k >= 6 ] 
[ mydict[k] for k in mydict.keys() if k >= 6 ] 
map(mydict.get, filter(lambda k: k >= 6, mydict.keys())) 
+1

Bạn có nghĩa là 'if', không phải' where', trong danh sách của bạn. –

+1

D'oh. Chắc chắn. Quá nhiều SQL gần đây ... – ephemient

1

Nếu bạn biết chìa khóa lớn nhất và không có thiếu phím bạn cũng có thể đi thẳng qua dictonary: [mydict[x] for x in range(6, largest_key+1)]. Đó sẽ là cách hiệu quả nhất.

+1

@bukzor: Sau đó, bạn có rất nhiều phím bị thiếu, do đó, điều này không áp dụng. Mặt khác, xem xét một dict với 10^9 mục mà bạn muốn x <100 - chỉ mất 100 tra cứu, thay vì 10^9 so sánh. –

0

Để có được một cuốn từ điển ngay lập tức: (chỉ hoạt động trong cả hai python 2 và 3)

dict((k,v) for k,v in mydict.items() if k >= 6) 
6

Nó có thể được thực hiện với filter quá.

In [9]: data = {5:"djdj", 6:"8899", 7:"998kdj"} 

In [10]: dict(filter(lambda x: x[0] > 5, data.items())) 
Out[10]: {6: '8899', 7: '998kdj'} 
Các vấn đề liên quan