2011-01-14 53 views
14

Tôi có một thiết lập từ điển python như vậySorting phím từ điển dựa trên giá trị của họ

mydict = { 'a1': ['g',6], 
      'a2': ['e',2], 
      'a3': ['h',3], 
      'a4': ['s',2], 
      'a5': ['j',9], 
      'a6': ['y',7] } 

tôi cần phải viết một hàm trả về các phím lệnh trong một danh sách, tùy thuộc vào cột của bạn sắp xếp trên ví dụ như vậy nếu chúng ta đang sắp xếp trên mydict [key] [1] (tăng dần)

tôi sẽ nhận được một danh sách lại như vậy

['a2', 'a4', 'a3', 'a1', 'a6', 'a5'] 

Nó chủ yếu hoạt động, ngoài việc khi bạn có các cột của va cùng lue cho nhiều phím, ví dụ như. 'a2': ['e', 2] và 'a4': ['s', 2]. Trong trường hợp này nó sẽ trả về danh sách như vậy

['a4', 'a4', 'a3', 'a1', 'a6', 'a5'] 

Dưới đây là các chức năng tôi đã xác định

def itlist(table_dict,column_nb,order="A"): 
    try: 
     keys = table_dict.keys() 
     values = [i[column_nb-1] for i in table_dict.values()] 
     combo = zip(values,keys) 
     valkeys = dict(combo) 
     sortedCols = sorted(values) if order=="A" else sorted(values,reverse=True) 
     sortedKeys = [valkeys[i] for i in sortedCols] 
    except (KeyError, IndexError), e: 
     pass 
    return sortedKeys 

Và nếu tôi muốn sắp xếp trên cột số ví dụ nó được gọi như vậy

sortedkeysasc = itmethods.itlist(table,2) 

Vì vậy, có đề xuất nào không?

Paul

+0

bạn chỉ cần sử dụng 'khóa' kwarg của hàm sắp xếp – ulidtko

Trả lời

36

Nó sẽ không thể dễ dàng hơn để sử dụng

sorted(d, key=lambda k: d[k][1]) 

(với d làm từ điển)?

+0

Kiểu dáng đẹp, +1. Và điều này trả về một danh sách như mong muốn. – user225312

+0

Vâng, và sự lười biếng của người lặp lại đặc biệt là một lợi thế. Giải pháp này là tốt hơn so với tôi, đáng tiếc là tôi không thể upvote hai lần%) – ulidtko

+0

@ulidtko: Các tạp chí không đặc biệt phù hợp, vì 'sắp xếp()' sẽ tạo ra toàn bộ danh sách trước khi sắp xếp. Nó sẽ tương đương với việc sử dụng 'a = d.keys(); a.sort (key = lambda k: d [k] [1]) 'ở đây, nhưng' được sắp xếp (d.keys(), ...) 'sẽ tạo một bản sao dự phòng của danh sách. –

9
>>> L = sorted(d.items(), key=lambda (k, v): v[1]) 
>>> L 
[('a2', ['e', 2]), ('a4', ['s', 2]), ('a3', ['h', 3]), ('a1', ['g', 6]), ('a6', ['y', 7]), ('a5', ['j', 9])] 

>>> map(lambda (k,v): k, L) 
['a2', 'a4', 'a3', 'a1', 'a6', 'a5'] 

Ở đây bạn sắp xếp các mục từ điển (cặp khóa-giá trị) sử dụng một chìa khóa - callable này thiết lập một trật tự tổng vào các mục.

Sau đó, bạn chỉ lọc ra các giá trị cần thiết bằng cách sử dụng map với lambda chỉ cần chọn khóa. Vì vậy, bạn sẽ có được danh sách các phím cần thiết.


EDIT: thấy this answer kiếm một giải pháp tốt hơn nhiều.

+3

Tôi cũng phần nào với '[k cho (k, v) trong sắp xếp (...)]'. –

+0

Blimey rất tốt đẹp thankyou! Ít mã hơn giải pháp của tôi quá! – PDStat

0
def itlist(table_dict, col, desc=False): 
    return [key for (key,val) in 
     sorted(
      table_dict.iteritems(), 
      key=lambda x:x[1][col-1], 
      reverese=desc, 
      ) 
     ] 
3

Mặc dù có rất nhiều câu trả lời làm việc ở trên, sự thay đổi nhỏ/sự kết hợp của họ là nhất pythonic với tôi:

[k for (k,v) in sorted(mydict.items(), key=lambda (k, v): v[1])] 
0
>>> mydict = { 'a1': ['g',6], 
...   'a2': ['e',2], 
...   'a3': ['h',3], 
...   'a4': ['s',2], 
...   'a5': ['j',9], 
...   'a6': ['y',7] } 
>>> sorted(mydict, key=lambda k:mydict[k][1]) 
['a2', 'a4', 'a3', 'a1', 'a6', 'a5'] 
>>> sorted(mydict, key=lambda k:mydict[k][0]) 
['a2', 'a1', 'a3', 'a5', 'a4', 'a6'] 
Các vấn đề liên quan