2014-04-09 2 views
1

у меня есть список 760 файлов, из которого я извлечения 2 строки данных, которые затем хранятся в словаре:Python3: сортировка списка словарных ключей

output = {'file number':data, '1':somedatain1, '2':somedatain2, ... '760':somedatain760}

нотабене Номера являются строками, потому что они были получены путем создания os.listdir ('.'), Чтобы получить список имен файлов и разделить строку вниз. [Я мог преобразовать это в целое число (using int()), если это необходимо]

Словарь затем распечатан путем создания списка ключей и итерации:

keys = output.keys() 
for x in keys: 
    print(x, '\t', output[x]) 

Однако выход в случайном порядке [из-за неупорядоченного характера словаря, который, я считаю, является неотъемлемым свойством - хотя я не знаю, почему это так), и было бы гораздо удобнее, если бы результат был в порядке чисел в соответствии с номером файла. Это, затем подбрасывает вопрос:

Учитывая, что мой список ключей либо

1. keys = ['filename', '2', '555', '764' ... '10']

или, если я изменить строку номер файла в целое число:

2. keys = ['filename', 2, 555, 764 ... 10]

как сортировать мой список ключей в соответствии т o числовое значение номера файла, если оно является строкой (как показано в пункте 1 выше), или если оно относится к типам смешанных объектов (т. 1 строка и 760 целых чисел, как показано выше в 2)?

+1

Сначала вы должны определить, как вы хотите, сравнение ' 'имя файла' <2' работать. – roippi

+0

О порядке упорядочения словаря: [Почему порядок в словарях Python произволен?] (Http://stackoverflow.com/q/15479928) –

ответ

3

Вы можете задать функцию sorted() ключ:

sorted(output, key=lambda k: int(k) if k.isdigit() else float('-inf')) 

Это будет сортировать струне до номера, однако. Обратите внимание, что нет необходимости звонить dict.keys(); итерация по словарю уже дает последовательность ключей, просто вызовите sorted() прямо на словарь.

Python 3 не определяет порядок строк по сравнению с числами, поэтому для любого ключа, который не является цифрой, вместо этого отправляется float('-inf') (отрицательная бесконечность), чтобы поместить эти ключи в начале заказа.

Демо:

>>> sorted(keys, key=lambda k: int(k) if k.isdigit() else float('-inf')) 
['filename', '2', '10', '555', '764'] 
Смежные вопросы