2012-02-25 36 views
8

Tôi có từ điển mà tôi đã chuyển đổi thành danh sách để tôi có thể sắp xếp theo mục đầu tiên. Khóa trong từ điển là một chuỗi (số), giá trị là một số nguyên được duy trì trong danh sách.
Danh sách từ việc chuyển đổi từ điển hình như:Sắp xếp danh sách lồng nhau theo mục đầu tiên - itemgetter không thực hiện thủ thuật

[('228055', 1), ('228054', 1), ('228057', 2), ('228056', 1), ('228051', 1), ('228050', 1),  ('228053', 1), ('203184', 6), ('228059', 1), ('228058', 1), ('89370', 2), ('89371', 3), ('89372', 2), ('89373', 1), ('89374', 1), ('89375', 1), ('89376', 1), ('89377', 1), ('89378', 1), ('89379', 1),.........] 

Có khoảng 240.000 mục trong từ điển. Tôi muốn sắp xếp từ điển theo chỉ mục đầu tiên, nhưng khi tôi sử dụng itemgetter (0), nó sắp xếp danh sách theo tất cả "1" đầu tiên. Các chàng liệt kê được sắp xếp như sau:

[('0', 3), ('1', 3), ('10', 3), ('100', 4), ('1000', 3), ('10000', 1), ('100000', 3), ('100001', 2), ('100002', 3), ('100003', 3), ('100004', 2), ('100005', 2), ('100006', 2), ('100007', 2), ('100008', 2), ('100009', 2), ('10001', 1), ('100010', 3), ('100011', 3), ('100012', 3), ('100013', 2), ('100014', 1), ('100015', 1), ('100016', 1), ('100017', 1), ('100018', 1), ....] 

Tôi muốn danh sách để được sắp xếp theo [ '0', 3), ('1', 3), ('2', số nguyên), ('3' , số nguyên), ... ('240.000', số nguyên)]

Đây là mã tôi đang đọc trong một tệp văn bản từ điển, chuyển đổi thành danh sách và mục được sử dụng để sắp xếp theo mục đầu tiên trong danh sách lồng nhau . Tôi cần từ điển trong mã vì tôi phụ thuộc rất nhiều vào nó để tra cứu các giá trị bằng khóa. Tôi chỉ cố gắng sắp xếp từ điển cho tệp đầu ra khi tất cả các tiến trình được chạy. Cảm ơn vì bất kì sự giúp đỡ.

import sys, string, csv, arcpy, os, fileinput, traceback 
from arcpy import env 
from operator import itemgetter 


#Creating a dictionary of FID: LU_Codes from external txt file 
text_file = open("H:\SWAT\NC\FID_Whole_Copy.txt", "rb") 
#Lines = text_file.readlines() 
FID_GC_dict = dict() 
reader = csv.reader(text_file, delimiter='\t') 
for line in reader: 
    FID_GC_dict[line[0]] = int(line[1]) 
text_file.close() 

dict_List = [(x, FID_GC_dict[x]) for x in FID_GC_dict.keys()] 
dict_List.sort(key=itemgetter(0)) 
print dict_List 
+1

'text_file = mở (r "H: \ SWAT \ NC \ FID_Whole_Copy.txt") ' – kev

Trả lời

7

Thay đổi khóa để chuyển chuỗi thành int sẽ giúp bạn, đây cũng là một số mẹo sắp xếp khác.

from operator import itemgetter 

list_to_sort=[('89372', 2), ('89373', 1), ('89374', 1), ('89375', 1), ('89376', 1),  ('89377', 1), ('228055', 1), ('228054', 1), ('228057', 2), ('228056', 1), ('228051', 1), ('228050', 1),('228053', 1), ('203184', 6), ('228059', 1), ('228058', 1), ('89370', 2), ('89371', 3), ('89372', 2), ('89373', 1), ('89374', 1), ('89375', 1), ('89376', 1), ('89377', 1)] 
print list_to_sort 

list_to_sort.sort() 
print list_to_sort # badly sorted as described 

list_to_sort.sort(key=itemgetter(0)) 
print list_to_sort # badly sorted as described (same as above) 

list_to_sort.sort(key=lambda x: int(x[0])) 
print list_to_sort # sorted well 

list_to_sort.sort(key=lambda x: int(x[0]), reverse=True) 
print list_to_sort # sorted well in reverse 

Lưu ý phụ về việc tạo danh sách để sắp xếp từ dict. iteritems() là một cách đẹp hơn làm những gì bạn làm với những điều sau

dict_List = [(x, FID_GC_dict[x]) for x in FID_GC_dict.keys()] 

dict_List = [(k,v) for k,v in FID_GC_dict.iteritems()] 
+0

Vui lòng kiểm tra mã của bạn trước khi đăng; những "mẹo" này bị hỏng. Dòng "gen_sorted =" đầu tiên của bạn sẽ không hoạt động: một genexp không có phương thức .sort(). Đối với "[k, v của bạn trong FID_GC_dict.iteritems()]" cú pháp là sai - không có "cho", vì vậy đây là "[k, (v trong FID_GC_dict.iteritems())] Cả hai của bạn cuối cùng" "Tôi sẽ không bao giờ downvoted một câu trả lời, bao giờ hết, nhưng tôi rất cám dỗ thời gian này. Linda: xin vui lòng không học Python từ" câu trả lời "này. @Ignacio Vazquez – DSM

+0

Vâng, tôi đã vội vã, nó không được kiểm tra và tôi nghĩ rằng sắp xếp trên một danh sách được trả về một lần lặp lại, không phải ghi chú của tôi ở trên và câu trả lời đã được thay đổi hoàn toàn –

+0

Nhận xét của DSM không còn giữ, câu trả lời đã được cập nhật và cố định, kiểm tra và xác minh dựa trên phản hồi của anh ta –

14

Đó là vì chúng là các chuỗi.

key=lambda x: int(x[0]) 
+0

Bạn đá !! Cảm ơn rất nhiều! – Linda

+0

Tại sao không thể thực hiện khóa = int (itemgetter (0))? Tôi nhận được lỗi này: TypeError: int() đối số phải là một chuỗi hoặc một số, không phải 'operator.itemgetter'. Ồ, tôi sẽ dùng lambda. –

+0

@ tommy.carstensen: 'operator.itemgetter()' trả về một hàm. Bạn không thể chuyển đổi hàm thành số nguyên. –

Các vấn đề liên quan