【问题标题】:More concise way to filter a list?更简洁的过滤列表的方法?
【发布时间】:2017-10-11 11:16:46
【问题描述】:

如果我有清单

a=[4, 5, 6]

据我所知,最简单的过滤方法是:

[i for i in a if a<6]

现在我刚刚被介绍到数据帧,其中的数据帧像

df = pd.DataFrame({'a':[4, 5, 6], 'b':[7, 1, 2]})

我可以通过指定元素和条件来应用(行)过滤器:

df[df['a']<6]

这似乎比过滤列表的方式更简洁,而且可能更不容易混淆(一旦你习惯了)。无法通过简单地在 [] 中指定条件来应用列表过滤器,例如

a[<6]

很明显,目前还没有这样实现,但是现在的方法是不是比较冗长?为什么不能简化?

【问题讨论】:

  • 你也不能用数据框做a[&lt;6]

标签: python filtering


【解决方案1】:

你有上面最简单的方法。但是,您可以使用以下

filtered_list = filter(lambda k: k < 6, original_list)

这看起来很棒,但我仍然对列表理解情有独钟。

【讨论】:

  • 在这种情况下不要使用 lambda,它比列表理解效率低。
  • 我同意。 List comp 是前进的方向。我只是想我给 A.n.other 方法。
【解决方案2】:

您不能完全拥有您要求的语法,但如果您想创建自己的列表类,您可以拥有一个同样简洁的:

class List(list):
    def __lt__(self, other):
        return List(i for i in self if i < other)

a = List([4,5,6])
b = a < 6
assert b == [4,5]

【讨论】:

    【解决方案3】:

    是的,可以构建 Python 语言,以便 a[&lt;6] 进行您想要的过滤,但是每个 Python 程序员和每个 Python 编译器都必须学习这种特殊语法,以便在一些特殊情况下节省一点源代码:>、>=、==、

    Pandas 会像您展示的那样做一些事情,但它是为大量数值分析而构建的,因此语法糖可能更值得付出代价。此外,pandas 倾向于提供大量受 R 语言启发的语法糖,因此它不是非常惯用的 python。

    【讨论】:

    • 作为一个完全了解实际开发编程语言复杂性的新手,如果我表现得令人讨厌或无知,请原谅我,但是....任何代码都无法处理切片列表被写来解释任何条件语句,包括布尔组合?这似乎是一个相当普遍和广泛的应用程序,并且对于程序员来说学习一种比当前过滤习惯更直接和更容易学习的语法并不难(尽管这确实是对列表理解的有用介绍)。
    • 总是很难获得编译器和人类都能理解的语法,同时又不让它变得非常复杂。例如:为什么不将a[6&gt;] 用作[x for x in a if 6 &gt; x] 的简写?然后,每个人都必须知道将 x 放在哪里,但即使是 pandas 也会让您将 dataframe[column] 放在它的简写中。或者,为什么不a[+6]?根据您的规则,编译器会将其读取为[x for x in a if x + 6](有效过滤器,顺便说一句),但人类可能会将其读取为[x + 6 for x in a]。因此,您将需要更多的复杂性(读取字符和/或错误)以使其明确和直观。
    • 谢谢@combinatorist。
    • Numpy 数组似乎可以使用更精简的过滤器表达式。 (抱歉耽搁了,我是一名正在接受培训的pythonista,所以你可以告诉我我的课程在哪里!)。诚然,它本身不是过滤器,但对于数组 A,A
    • 是的,我很欣赏您的 cmets,我可以看到更具体的域更适合适合其类型的专门语法。在列表的情况下,我现在意识到 numpy 语法实际上已经到位 - 列表已经有一个小于运算符,它只是意味着与我想要的不同的东西(一个返回小于指定表达式的所有元素的过滤器.. .)。我想如果我考虑足够长的时间,我可能会想到 list[
    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多