从为某些项复制的列表中删除列表

2024-04-20 01:31:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一个列表中删除第一项和第三项相同但只保留第一项的列表。示例列表和输出:

li=[ [2,4,5], [1,3,5], [1,6,5] ]
output_list = [ [2,4,5], [1,3,5] ]

我编写的代码需要很长时间才能执行,因为原始列表包含数百万个列表。在

^{pr2}$

如何改进代码?提前谢谢。在


Tags: 代码示例列表outputlilistpr2
3条回答

利用OrderedDict和字典具有唯一键这一事实。在

>>> from collections import OrderedDict
>>> li=[ [2,4,5], [1,3,5], [1,6,5] ]
>>> OrderedDict(((x[0], x[2]), x) for x in reversed(li)).values()
[[1, 3, 5], [2, 4, 5]]

使用集合存储可见元素。速度更快:

seen = set()
res = []
for entry in li:
    cond = (entry[0], entry[2])
    if cond not in seen:
        res.append(entry)
        seen.add(cond)


[[2, 4, 5], [1, 3, 5]]

添加

另外,花在思考告诉变量名称上的时间通常是很好的。通常情况下,作为一次性解决方案,事情会比预期的持续时间长得多。在

改进版:

b_li = set()
output_list = []
b_li_add = b_li.add
output_list_append = output_list.append
for x in li:
    s = (x[0], x[2])
    if s not in b_li:
        b_li_add(s)
        output_list_append(x)

变化包括:

  • set()使用b_li,这样可以加快查找速度。在
  • s转换为元组,因为不需要将唯一的第一和第三个元素存储为列表。在
  • 减少了函数查找,也加快了代码的速度。在

相关问题 更多 >