python - 在嵌套的元组列表中保留第一次出现的字符串
问题描述
我有以下列表:
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 循环,但只能获取每个元组的第一项,而不是第二项。
解决方案
在反向列表上使用字典构造函数将产生所需的结果,但顺序相反。您可以再次反转它以获得原始顺序的最终结果:
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])]
推荐阅读
- css - 元素的动态变化样式(DomIcon)
- python - 旋转不完整的盒子,使其垂直
- c++ - 在 c++ 中使用 Tensorflow Lite 在边缘 TPU 上运行“mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite”时出现问题
- ruby-on-rails - Rails 在 created_at 年份添加索引
- html - 如何在闪亮的应用程序中垂直居中操作按钮?
- r - Tidyr::spread() 错误:每行输出必须由唯一的键组合标识
- php - 如何使用 Gmail API 和 PHP 转发一封邮件?
- c# - Unity Remote 5 不适用于 Unity 2019.3
- r - 如何在R中绘制变量的下一个周期值与其过去的周期
- c# - 在 C# 中从磁盘读取短数组的最佳方法?