【问题标题】:What is the most Pythonic way to filter a set?过滤集合的最 Pythonic 方式是什么?
【发布时间】:2016-02-29 21:41:48
【问题描述】:

我有一个包含替换的列表,我想做两件事:

  1. 删除重复项
  2. 按特定条件删除所有元素,确切地说,我想删除所有大于某个值的元素。

我想我可以使用过滤器 2 而不是使用设置来实现 1 像

list(set(filter(lambda x:x<C, l)))

有没有更好/更pythonic/更有效的方法?

【问题讨论】:

  • 我的意思是你遇到元素的顺序,集合是无序的,所以如果你想保持某种顺序,使用集合将不走运
  • 实际上在我的情况下顺序并不重要

标签: python filter set


【解决方案1】:

在我看来,最 Pythonic 的过滤集合的方法是使用集合操作(​​维恩图):

A = {0, 1, 4, 5, 8}; 
B = {2, 1, 3, 4, 6}; 

print("Union :", A | B) 

print("Intersection :", A & B) 

print("Difference :", A - B) 

print("Symmetric difference :", A ^ B) 

另一个示例,当您只想从集合 A 中删除值 5 时,您只需键入:

A - {5,}

在这个问题中,如果您需要过滤比 C 更大的值,您只需键入 Python 代码中执行集合的“包含检查”运算符“in”。包含() 魔术方法(魔术方法不应该被直接调用,这就是你使用“in”的原因):

{x for x in l if x > C}

【讨论】:

    【解决方案2】:

    最好的两种方法是过滤:

    new_list = list(set(filter(lambda x:x<C, l)))
    

    或集合推导(许多人会认为它更符合 Python 风格,甚至更高效):

    list({x for x in l if x < C})
    

    但我想,如果你熟悉过滤器,你可以坚持下去。

    【讨论】:

    • 你可以做一个集合理解而不是将你的列表组合转换成一个集合
    • 谢谢,我不知道我在想什么。
    • 如果我要将其转换为列表,是否使用集合理解比列表理解更好?
    • 绝对更短更高效。在编译方面,我相信这里的很多人会假装知道哪个更好,但最终差异实际上是不明显的。
    【解决方案3】:

    使用list comprehension 可能更“pythonic”。

    filtered = [x for x in set(lst) if x < C]
    

    【讨论】:

    • 但是在这样的理解中不会为每个 x 计算 set(lst) 吗?
    • @Meni 绝对不是。 for x in set(lst) 在将列表转换为集合后创建一个迭代器,然后列表推导遍历它并在 x &lt; C 时存储值。
    • 是否有理由使用列表推导而不是集合推导?
    • @Meni 我发现它更有意义,因为预期的输出是一个列表,而且我认为它比用list() 包装集合理解更清晰。但是,这并没有太大区别,这取决于您。
    猜你喜欢
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多