选择列表中最早的条目

时间:2011-01-25 14:48:44

标签: python list sorting

如果我有一个包含人名和日期的列表,我只想保留每个人最早的日期条目,我该怎么做?我希望最终列表按姓氏字母顺序排列,然后是名字,只包含最后日期最早的条目。

以下是列表的示例以及我尝试过的内容,但它只是再次给了我相同的列表。

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 个答案:

答案 0 :(得分:2)

尝试

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

您的代码无效,因为您正在L2搜索item.split(',')[:2],这只是名称。但是列表中的字符串包含名称和年份 - 这就是not in始终产生True的原因。

答案 1 :(得分:0)

>>> from itertools import groupby
>>> [next(j) for i, j in groupby(sorted(L1), lambda x: x.rpartition(",")[0])] == L2
True

答案 2 :(得分:0)

Python的内置列表和元组排序是递归的。如果您的数据存储如下:

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

它会按每个元组中的第一个项目对列表进行排序,然后按第二个项目对每个组进行排序,依此类推。结果是:

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

因此,如果你将字符串分解为(Date, Last, First)的元组然后排序,你将得到你想要的顺序,但是你必须将你的字符串拼接在一起。