首页 > 解决方案 > 在嵌套的元组列表中保留第一次出现的字符串

问题描述

我有以下列表:

d2 = [('PO:', [541, 297.5, 117, 14]),
 ('PD', [680, 297.5, 30, 12]),
 ('1/29/2021', [676, 317.5, 67, 14]),
 ('PDF:', [541, 317.5, 100, 14]),
 ('CSF-IPS', [204, 593.0, 357, 15]),
 ('1', [148, 593.0, 8, 14]),
 ('1', [148, 593.5, 8, 14]),
 ('10', [608, 593.5, 17, 14]),
 ('10', [608, 593.5, 17, 14]),
 ('20.00', [684, 593.5, 37, 14]),
 ('20.00', [684, 593.5, 37, 14]),
 ('200.00', [767, 593.5, 46, 14])]

我只需要保留每个项目的第一次出现,所以我的列表应该是:

[('PO:', [541, 297.5, 117, 14]),
 ('PD', [680, 297.5, 30, 12]),
 ('1/29/2021', [676, 317.5, 67, 14]),
 ('PDF:', [541, 317.5, 100, 14]),
 ('CSF-IPS', [204, 593.0, 357, 15]),
 ('1', [148, 593.0, 8, 14]),
 ('10', [608, 593.5, 17, 14]),
 ('20.00', [684, 593.5, 37, 14]),
 ('200.00', [767, 593.5, 46, 14])]

我试图只获取 d2 的键并编写了一个 for 循环,但只能获取每个元组的第一项,而不是第二项。

标签: pythonpython-3.xlisttuplesnested-lists

解决方案


在反向列表上使用字典构造函数将产生所需的结果,但顺序相反。您可以再次反转它以获得原始顺序的最终结果:

d2 = [('PO:', [541, 297.5, 117, 14]),
 ('PD', [680, 297.5, 30, 12]),
 ('1/29/2021', [676, 317.5, 67, 14]),
 ('PDF:', [541, 317.5, 100, 14]),
 ('CSF-IPS', [204, 593.0, 357, 15]),
 ('1', [148, 593.0, 8, 14]),
 ('1', [148, 593.5, 8, 14]),
 ('10', [608, 593.5, 17, 14]),
 ('10', [608, 593.5, 17, 14]),
 ('20.00', [684, 593.5, 37, 14]),
 ('20.00', [684, 593.5, 37, 14]),
 ('200.00', [767, 593.5, 46, 14])]

d3 = list(dict(reversed(d2)).items())[::-1]

print(d3)

[('PO:', [541, 297.5, 117, 14]), 
 ('PD', [680, 297.5, 30, 12]), 
 ('1/29/2021', [676, 317.5, 67, 14]), 
 ('PDF:', [541, 317.5, 100, 14]), 
 ('CSF-IPS', [204, 593.0, 357, 15]), 
 ('1', [148, 593.0, 8, 14]), 
 ('10', [608, 593.5, 17, 14]), 
 ('20.00', [684, 593.5, 37, 14]), 
 ('200.00', [767, 593.5, 46, 14])]

[编辑]为了支持不连续的重复条目,您仍然可以使用字典构造函数,但您需要在使用反向列表更新之前按顺序获取键:

d3 = list(dict((*d2,*reversed(d2))).items())

您也可以使用列表理解中的集合来执行此操作,这可能会使用更少的内存:

d3 = [(k,v) for s in [set()] for k,v in d2 if k not in s and not s.add(k)]

如果重复条目总是连续的,您可以按照 Kelly 的建议使用 groupby(来自 itertools):

d3 = [next(v) for _,v in groupby(d2,lambda t:t[0])]

推荐阅读