为了账号安全,请及时绑定邮箱和手机立即绑定

从列表中删除对某些项目重复的列表

从列表中删除对某些项目重复的列表

隔江千里 2021-03-16 13:13:20
我正在尝试从具有相同的第一项和第三项但仅保留第一项的列表中删除列表。示例列表和输出:li=[ [2,4,5], [1,3,5], [1,6,5] ]output_list = [ [2,4,5], [1,3,5] ]我编写的代码需要很长时间才能执行,因为原始列表包含数百万个列表。b_li = []output_list = []for x in li:    s = [ x[0], x[2] ]    if s not in b_li:        b_li.append(s)        output_list.append(x)如何改善代码?提前致谢。
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

改进的版本:


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成元组,因为没有必要存储唯一的第一和第三元素列表。

  • 减少的函数查找也可以加快代码的速度。


查看完整回答
反对 回复 2021-03-29
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

使用一组存储可见的元素。那是更快的:


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]]

添加


同样,花费在思考告诉变量名称上的时间通常是合理的。通常,作为一次性解决方案的第一件事要比预期持续更长的时间。


查看完整回答
反对 回复 2021-03-29
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

利用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]]


查看完整回答
反对 回复 2021-03-29
  • 3 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信