Python: сортировка кортежа по дате. Нуб тут - PullRequest
1 голос
/ 12 января 2011

Привет всем.Я хотел бы отсортировать и вернуть раздел кортежа с сортировкой по дате.

Я бы хотел отсортировать только первую и четвертую запись (кортеж [: 3]) и распечатать ее.

tuple = [('Dec 1, 2010', '7.41', '7.60', '7.37'), 
         ('Dec 4, 2010', '7.41', '7.60', '7.37'), 
         ('Dec 2, 2010', '7.41', '7.60', '7.37'), 
         ('Dec 20, 2010', '7.41', '7.60', '7.37'), 
         ('Dec 16, 2010', '7.41', '7.60', '7.37'), 
         ('Jan 2, 2011', '7.41', '7.60', '7.37')]

Я пытался:

import operator
sorted(tuple[:3], key=operator.itemgetter('date'), reverse=True)

Но он вернул ошибку «Ошибка типа: индексы кортежа должны быть целыми числами, а не стр.

Ответы [ 4 ]

7 голосов
/ 12 января 2011

Почему вы получаете date?не первый элемент кортежа, что вы ищете?

sorted(records[:3], key=operator.itemgetter(0), reverse=True)

Кстати, вы должны преобразовать строку в фактическую дату, прежде чем сравнивать их.Может быть:

from datetime import datetime
def get_date(record):
     return datetime.strptime(record[0], "%b %d, %Y")
sorted(records[:3], key=get_date, reverse=True)

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

1 голос
/ 12 января 2011

Во-первых, [] - это не кортеж, он называется списком (см. этот пост на daniweb.com ).

Во-вторых, в ссылке dictionaryот key до value.Поскольку список одномерный, вы можете получить значение, только запросив индекс.

>> dic = {'date' : 'value', 'bla' : 'foo'}
>> dic['date']
value
>> dic['bla']
foo

>> list = ['a', 'b', 'c']
>> list[0]
a
>> list[2]
c

Скорее всего, вы хотите преобразовать даты в datetime.datetime объекты перед их сортировкой.Поскольку они являются строками (в вашем примере), они будут отсортированы по алфавиту , а не по дате.

0 голосов
/ 13 января 2011

Текст 'date' не является магическим. operator.itemgetter использует все, что передается в качестве индекса, на что бы он ни смотрел. Он не пытается понять, что означает 'date'.

'date' - это строка. У dict есть ключи, которые являются строками. У вас есть tuple в вашем списке. tuple имеет целочисленные ключи, начинающиеся с 0.

Более того, использование key для сортировки просто говорит: «Как только вы получили ключ от каждого элемента, сортируйте элементы по значениям ключа, интерпретируя значения ключа обычно ». Начальным элементом каждого из ваших tuple s не является магически какой-либо объект Date только потому, что они похожи на даты для вас и меня. Это строки, и они будут сравниваться как строки.

@ tokland показывает, как настроить код для операции «при наличии одного из этих кортежей, захватить начальный элемент и преобразовать его в дату, используя модуль datetime». Затем он вызывает сортировку, используя эту операцию для ключа.

0 голосов
/ 12 января 2011

Проблема в том, что вы запрашиваете ключ 'date'.Это сработало бы, только если элементы данных были словарями с 'date' в них.

Как указал tokland, вам нужно использовать 0, поскольку это элемент запрашиваемых кортежей, первыйone.

Кроме того, убедитесь, что на самом деле не назовите свой tuple «кортеж»: это имя самого типа, и вы не хотите заменять его другим значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...