如果我有一个包含人名和日期的列表,我只想保留每个人最早的日期条目,我该怎么做?我希望最终列表按姓氏字母顺序排列,然后是名字,只包含最后日期最早的条目。
以下是列表的示例以及我尝试过的内容,但它只是再次给了我相同的列表。
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']
非常感谢任何帮助或见解!
答案 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)
的元组然后排序,你将得到你想要的顺序,但是你必须将你的字符串拼接在一起。