【问题标题】:Python: Removing entries from ordered list, that are not in unordered listPython:从有序列表中删除不在无序列表中的条目
【发布时间】:2012-02-11 22:53:45
【问题描述】:

我有两个列表:

ordered = ['salat', 'baguette', 'burger', 'pizza']
unordered = ['pizza', 'burger']

现在我想从有序列表中删除所有不在无序列表中的条目,同时保留排序。

我该怎么做?

【问题讨论】:

  • 你关心保持有序的顺序吗?
  • 是的,我需要订购
  • 您能否举例说明无序和有序的大小以及重叠的大小。是否还有其他未排序的项目?
  • 列表少于 20 项,重叠率约为 80%。

标签: python list sorting


【解决方案1】:
ordered = [item for item in ordered if item in unordered]

此方法使用 Python 的列表推导基于旧列表创建一个新列表。

对于大量数据,首先将无序列表变成一个集合,正如人们在 cmets 中建议的那样,在性能上会产生巨大的差异,例如:

unordered = set(unordered)

基准测试!

已订购:5000 件,未订购:1000 件
0.09561s 无设置
0.00042s 有集合

对于 10/2 个项目,时间几乎相同,因此无论数据大小如何,始终使用集合是好的。

【讨论】:

  • 这可能是我会做的,但如果列表很长,我可能会制作一组无序版本以加快成员资格测试。
  • +1 这是最惯用的解决方案。我也不会尝试加快速度,除非性能成为问题。
  • unordered 转换为set 以提高运行时效率是有意义的
  • @DSM:啊!抱歉,一定是浏览器缓存/刷新问题。虽然,为什么对较小的数据集使用列表(而不是集合)会更快?那个时候哈希函数真的很贵吗?还是我还缺少其他东西?
  • @inspectorG4dget:在 4 和 2 的情况下(我得到的 timeit 结果为 0.473s 而没有设置为 0.696),设置的构造开销太大了。当然,在这种微不足道的情况下,无论如何它只需要很少的时间,根本没有理由担心性能......
【解决方案2】:

最好使用一个集合来测试成员资格,像这样:

ordered = ['salat', 'baguette', 'burger', 'pizza']
unordered = ['pizza', 'burger']

unord = set(unordered)
ordered = [e for e in ordered if e in unord]

【讨论】:

    【解决方案3】:

    类似这样的:

    ordered = list(filter(lambda x: x not in unordered, ordered))
    

    如果使用 Python list 函数。

    【讨论】:

    • 不得不说,这也太丑了。
    • 是的,你是对的。在看到您的答案之前,我没有想到列表推导。
    猜你喜欢
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 2020-03-24
    • 1970-01-01
    • 2017-01-15
    • 2018-01-10
    相关资源
    最近更新 更多