сортировать объекты даты в Python - PullRequest
0 голосов
/ 07 августа 2010

Я начинаю со строк даты:

from operator import itemgetter
import datetime as DT

# unsorted dates
raw = (map(int, "2010-08-01".split("-")),
       map(int, "2010-03-25".split("-")),
       map(int, "2010-07-01".split("-")))

transactions = []
for year, month, day in raw:
    new = (DT.date(year, month, day), "Some data here")
    transactions.append(new)
# transactions is now a list with tuples nested inside, for example
# [(date, "Some data here"), (date, "Some data here")]

sorted(transactions, key=itemgetter(0))

for info in transactions:
    print info

Я получаю следующее, и оно не отсортировано по дате:

(datetime.date(2010, 8, 1), 'Some data here')
(datetime.date(2010, 3, 25), 'Some data here')
(datetime.date(2010, 7, 1), 'Some data here')

Как мне отсортировать их по дате?

Ответы [ 3 ]

4 голосов
/ 07 августа 2010

Ну, причина, по которой он не отсортирован, состоит в том, что вы не переназначили отсортированный список обратно на transactions;Вы хотите:

transactions = sorted(transactions, key=itemgetter(0))

Я должен отметить, что datetime имеет функцию strptime, которая делает то, что вы делаете вручную:

transactions = [ ( DT.datetime.strptime( datestring, "%Y-%m-%d" ).date(), "Some data here" ) for datestring in datestrings ]

Вы также можете предпочесть collections.OrderedDict, хотя, возможно, нет ...

alt_transactions = collections.OrderedDict( sorted( transactions.items( ) ) )
3 голосов
/ 07 августа 2010

sorted возвращает отсортированный список, но сам ввод остается неизменным.Попробуйте вместо

transactions.sort(key=itemgetter(0))

.(По умолчанию кортежи сравниваются лексикографически, поэтому key не требуется).

2 голосов
/ 07 августа 2010

Вам следует использовать метод сортировки, если вы хотите изменить исходные данные, часто лучше сохранить исходные данные и отсортировать по sorted () и присвоить значение в новой переменной.

transactions.sort()

Элемент управления ключами не нужен, так как вы хотите обычную сортировку.

Моя версия для всего вашего кода:

import datetime as DT

# unsorted dates
raw = ("2010-08-01","2010-03-25","2010-07-01")

datetuples = [tuple(int(numstr) for numstr in dt.split('-'))
              for dt in raw] ## numbers from strings 

transactions = [(DT.date(* dateint),
                 "Some data here") for dateint in datetuples]

transactions.sort()

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