2013-05-23 41 views

Trả lời

65

I need to iterate over this is sorted order by the key.

Tôi nghĩ lambdas là quá mức cần thiết ở đây, hãy thử này:

>>> steps = {1:"val1", 5:"val2", 2:"val3"} 
>>> 
>>> for key in sorted(steps): 
...  print steps[key] 
... 
val1 
val3 
val2 
+1

đã hoạt động, nhờ – user984003

+2

Điều gì sẽ xảy ra nếu khóa là một chuỗi, nhưng tôi cần sắp xếp nó là một int? – user984003

+0

'sắp xếp (bước)' tốt hơn 'sắp xếp (bước.keys())' – jamylak

9

Bạn cần lặp lại trên steps.items(), bởi vì một lần lặp qua dict chỉ trả về các khóa của nó.

>>> x = sorted(steps.items()) 
>>> x 
[(1, 'value1'), (2, 'value3'), (5, 'value2')] 

lặp qua các phím được sắp xếp:

>>> for key in sorted(steps): 
...  # use steps[keys] to get the value 
+0

như vậy thì làm thế nào Tôi lặp lại nó, giống như một iteritems hay cái gì đó? – user984003

+0

@ user984003 Bạn không thể sắp xếp lệnh chính tả, bạn chỉ có thể nhận danh sách các khóa, giá trị hoặc mục được sắp xếp. –

+0

@AshwiniChaudhary Bạn không cần một 'khóa' cho' sắp xếp', tất cả các khóa từ điển sẽ là duy nhất để 'sắp xếp (steps.items())' hoạt động tốt – jamylak

0

Tùy thuộc vào trường hợp sử dụng của bạn, nó có thể là một lựa chọn để giữ một từ điển đã đặt hàng. Xem pythons OrderedDict để biết chi tiết. Nếu bạn muốn sắp xếp các khóa là số nguyên, bạn phải chuyển đổi chúng thành số nguyên. Thời điểm tốt nhất để làm như vậy tùy thuộc vào trường hợp sử dụng của bạn.

6

Bạn cũng có thể sử dụng một trong nhiều loại vùng chứa SortedDict của Python. Các loại này tự động duy trì từ điển được sắp xếp theo thứ tự khóa. Hãy xem mô-đun sortedcontainers là các triển khai thuần-Python và nhanh như C. Có một số performance comparison đánh dấu một số triển khai khác với nhau.

Trong trường hợp của bạn sau đó, bạn muốn sử dụng:

from sortedcontainers import SortedDict 
steps = SortedDict({1:"value1", 5:"value2", 2:"value3"}) 

# Then iterate the items: 

for key, value in steps.items(): 
    print key, value 

# Or iterate the values: 

for value in steps.values(): 
    print value 

Iteration cho các phím/giá trị/mục hoạt động tự động theo lệnh quan trọng được sắp xếp.

1

Giống như được chỉ định bởi Zagorulkin Dmitry, bạn không được chuyển lambda vào chức năng sắp xếp. Hành vi mặc định của chức năng sắp xếp là hành động trên các phím.

steps = {1:"val1", 5:"val2", 2:"val3"} 

for key in sorted(steps): 
    print steps[key] 
... 
val1 
val3 
val2 

Tuy nhiên, chuyển lambda sang chức năng sắp xếp không phải là hoạt động tốt hơn về lợi ích nhỏ (tức là 'quá mức'), nhưng thực sự không mong muốn. Nó làm cho mã ít đọc được và nó cũng chậm hơn, đặc biệt nếu bạn sẽ áp dụng nó vào các từ điển rất lớn hoặc thực hiện cuộc gọi nhiều lần. Ngoài việc làm cho mục tiêu phân loại rõ ràng hơn đối với cặp (khóa, giá trị), không có lợi ích gì khi sử dụng nó. Thời gian sau đây cho thấy hiệu suất bạn nhận được khi chỉ định lambda.

steps = {randint(0, 100000): randint(0, 100000) for _ in range(100000) } # random dict 

%%timeit 
sort_list = [value for _, value in sorted(steps.items(), key=lambda item: item[0])] 
1 loops, best of 3: 241 ms per loop 

%%timeit 
sort_list = [steps[k] for k in sorted(steps, key=lambda k: k)] 
1 loops, best of 3: 196 ms per loop 

%%timeit 
sort_list = [ steps[key] for key in sorted(steps) ] 
10 loops, best of 3: 106 ms per loop 
0

Trong trường hợp các phím của bạn không phải là số nguyên, nhưng chuỗi nên được phân tích như số nguyên:

steps = {'1':'value1', '10': 'value0', '5':'value2', '2':'value3'} 

bạn có thể sử dụng một cái gì đó tương tự như giải pháp của bạn:

for key, value in sorted(steps, key=lambda key: int(key[0])): 
    print(key) 

1 
2 
5 
10 
Các vấn đề liên quan