Сортировка списка вложенности по первому элементу - itemgetter не справляется с задачей - PullRequest
10 голосов
/ 25 февраля 2012

У меня есть словарь, который я преобразовал в список, чтобы я мог отсортировать по первому элементу. Ключ в словаре представляет собой строку (из цифр), значение представляет собой целое число, которое сохраняется в списке.
Список из словаря преобразования выглядит так:

[('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),.........]

В словаре содержится около 240 000 наименований. Я хотел бы отсортировать словарь по первому индексу, но когда я использую itemgetter (0), он сортирует список сначала по всем «1». Отсортированный список выглядит так:

[('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), ....]

Я бы хотел, чтобы список сортировался по ['0', 3), ('1', 3), ('2', целое число), ('3', целое число), ... ('240 000 ', целое число)]

Вот мой код, где я читаю в текстовом файле в словарь, преобразовываю в список и использую элементный виджет для сортировки по первому элементу во вложенном списке. Мне нужен словарь в коде, потому что я сильно зависим от него, чтобы искать значения по ключу. Я пытаюсь отсортировать словарь для выходного файла только после запуска всех процессов. Спасибо за любую помощь.

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

Ответы [ 2 ]

15 голосов
/ 25 февраля 2012

Это потому что они строки.

key=lambda x: int(x[0])
11 голосов
/ 26 февраля 2012

Смена ключа для преобразования строки в int поможет вам, также есть несколько других советов по сортировке.

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

Примечание по построению списка для сортировки по указанию. iteritems() - это лучший способ сделать то, что вы делаете с помощью следующего

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()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...