Сортировка CSV-файла в Python с помощью sorted () возвращает значения в порядке DESC программиста, а не в порядке DESC времени - PullRequest
2 голосов
/ 01 июня 2011

Я не делаю ничего слишком сложного, я верю.Я предварительно сортирую большой файл данных CSV, потому что он полон данных, которые поступают в случайном порядке времени.Индекс верный, но форматирование возврата отключено.

    sortedList=sorted(reader,key=operator.itemgetter(1))

Так что вместо сортировки, как [-100 -10 -1 0 10 100 5000 6000];Я получаю [-1 -10 -100 0 100 5000 60]

Я пробовал оба примера лямбда-функции и itemgetter, но я действительно не знаю, куда идти дальше.

Спасибо за помощь.

Ответ на мой вопрос в комментариях.Числовое значение сортировалось как строка, а не как число.Я не знал, что могу указать тип данных ключа в sorted ().Этот код работает, как я и предполагал:

    sortedList=sorted(reader,key=lambda x:float(x[1]))

Ответы [ 5 ]

3 голосов
/ 01 июня 2011

Только из вывода, который вы видите там, похоже, что они сортируются как строки, а не как числа.

Так что вы можете сделать:

sortedList=sorted(reader, key=lambda t: int( t[1] ))

или

sortedList=sorted(reader, key=lambda t: float( t[1] ))

Или, что еще лучше, попробуйте убедиться, что последовательность reader заполняется числами, а не строками, при ее создании, возможно, используя QUOTE_NONNUMERIC в качестве fmtparam для читателя (см. http://docs.python.org/library/csv.html#csv.QUOTE_NONNUMERIC).

1 голос
/ 01 июня 2011

Похоже, что "reader" возвращает строки, а вы хотите целые числа.Вы можете попробовать что-то вроде:

    sorted(reader, key=lambda x: float(x[1]))
0 голосов
/ 01 июня 2011

Мне нравится compose:

from operator import itemgetter

def compose(f, g):
    return lambda *a, **k: g(f(*a, **k))

sortedList = sorted(reader, key=compose(itemgetter(1), float))
0 голосов
/ 01 июня 2011

Похоже, ваш список сортируется как строки, а не числа.Когда вы читаете в своем CSV-файле, он все еще текстовый и должен быть сначала преобразован в целые числа.

0 голосов
/ 01 июня 2011

похоже, что ваши числа сортируются по алфавиту (в виде строк), а не по номерам:

>>> sorted([10,2000,30])
[10, 30, 2000]
>>> sorted(['10','2000','30'])
['10', '2000', '30']

Чтобы исправить это, вы можете передать числовую сортировку:

def numeric_compare(x, y):
    return int(x)-int(y)

>>> sorted(['10','2000','30'],cmp=numeric_compare)
['10', '30', '2000']
...