2011-01-12 2 views
1

Эй, все. Я хотел бы сортировать и возвращать раздел кортежа, отсортированный по дате.Python: Сортировка кортежа по дате. Noob здесь

Мне бы только хотелось разобраться с первым в 4-й записи (tuple [: 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) 

Но это ошибка возвращается «TypeError:. Индексы кортежей должны быть целыми, не ул

+8

Не вызывайте список 'tuple'. Он затеняет встроенный «кортеж», контейнер. – user225312

ответ

7

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

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

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

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 вы затеняете конструктор типа; Не менее важно: это список не кортежей, переменная должна быть множественной (поскольку она хранит коллекцию), и она должна иметь значащее имя.

0

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

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

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

+0

На самом деле у него есть список кортежей. –

+0

Правильно, я тоже заметил это. – JAL

1

Прежде всего, [] не является кортежем, его называют списком (см. this post on 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

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

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

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

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

Смежные вопросы