выбор самой ранней записи в списке - PullRequest
1 голос
/ 25 января 2011

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

Вот пример списка и того, что я пробовал, но он снова вернул мне тот же список.

L1=['Smith, John, 1994', 'Smith, John, 1996', 'Smith, John, 1998', 'Smith, Joan, 1993', 'Smith, Joan, 1995', 'Smith, Jack, 1989', 'Smith, Jack, 1991', 'Jones, Adam, 2000', 'Jones, Adam, 1998', 'Jones, Sarah, 2002', 'Jones, Sarah, 2005', 'Brady, Tom, 2001', 'Brady, Tonya, 2002']

L1.sort()

L2= []

for item in L1:
    if item.split(',')[:2] not in L2:
        L2.append(item)

Конечный продукт должен выглядеть так:

L2=['Brady, Tom, 2001', 'Brady, Tonya, 2002', 'Jones, Adam, 1998', 'Jones, Sarah, 2002', 'Smith, Jack, 1989', 'Smith, Joan, 1993', 'Smith, John, 1994']

Любая помощь или понимание будет принята с благодарностью!

Ответы [ 3 ]

2 голосов
/ 25 января 2011

Попробуйте

L1.sort()
[next(j) for i, j in itertools.groupby(L1, lambda x: x.rsplit(",", 1)[0])]

Ваш код не работает, так как вы ищете L2 для item.split(',')[:2], который является только именем. Но строки в списке состоят из имени и года - поэтому not in всегда дает True.

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

Встроенные в Python списки и кортежи сортируются рекурсивно. Если ваши данные были сохранены так:

L1=[(1,2,3),
    (2,3,4),
    (1,1,3)]

Он будет сортировать ваш список по первому элементу в каждом кортеже, затем сортировать каждую группу по второму элементу и так далее. Результат:

[(1, 1, 3), (1, 2, 3), (2, 3, 4)]

Таким образом, если вы разбиваете свои строки на кортежи (Date, Last, First), а затем сортируете, вы получите желаемый порядок, но тогда вам придется сшивать вашу строку обратно.

0 голосов
/ 25 января 2011
>>> from itertools import groupby
>>> [next(j) for i, j in groupby(sorted(L1), lambda x: x.rpartition(",")[0])] == L2
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...