更简洁的方式来过滤列表?
如果我有一个列表更简洁的方式来过滤列表?
a=[4, 5, 6]
据我知道的最简单的方法来过滤它是这样的:
[i for i in a if a<6]
现在,我刚刚被引入到dataframes,其中像
一个数据帧 :df = pd.DataFrame({'a':[4, 5, 6], 'b':[7, 1, 2]})
我可以只通过指定元件和条件施加(行)滤波器
df[df['a']<6]
这似乎更简洁,也许不像过滤列表的方式那样困惑(一旦你习惯了它)。可以不是列表过滤器由通过简单地在[]中指定的条件施加,如
a[<6]
很明显,它不实现目前这种方式,而不是当前的方法相对冗长?为什么不能简化?
您有上面最简单的方法。但是,您可以使用以下内容
filtered_list = filter(lambda k: k < 6, original_list)
这看起来不错,但我仍然对列表理解有一个软弱的地方。
不要在这样的情况下使用lambda,它比列表理解效率低。 –
我同意。列表比较是前进的方向。我只是想我给A.n.other其他方法。 – Chinny84
是的,可以构建python语言,以便a[<6]
完成您想要的过滤,但是接下来每个python程序员和每个python编译器都必须学习这种特殊语法,以在一些特殊情况下保存一些源代码: >,> =,==,< =,<。
熊猫做的事情就像你展示的那样,但它是为大量数值分析而建立的,所以语法糖可能更值得花费。此外,熊猫倾向于提供大量受R语言启发的语法糖,因此它不是非常习惯的python。
作为实际开发编程语言错综复杂的新手,请原谅我是否会变得厌恶或无知,但...... 无法处理任何代码处理切片列表被编写来解释任何条件声明,包括布尔组合?这看起来像是一个相当普遍和广泛的应用,并且程序员不难学习比当前的过滤习惯用法更直接和更容易学习的语法(尽管这对于列表理解来说是有用的介绍)。 – James
获得编译器和人都能理解的语法总是很难,而不会使其变得非常复杂。例如:为什么不用'a [6>]'作为'[x for x在if 6> x]'中的缩写'?然后,每个人都必须知道把'x'放在哪里,但即使是熊猫,你也可以将数据框[列]放在其简写中。或者,为什么不''[+6]'?根据你的规则,编译器会将它读为'[x for x in a x + 6]'(valid filter,btw)',但是,人类可能读为'[x + 6 for a x]。所以,你需要更多的复杂性(阅读字符和/或错误),使其明确直观。 – combinatorist
Thx @combinatorist。 – James
你不能正是你要求的语法,但如果你想创建自己的列表类,你可以拥有一个同样简洁:
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]
你不能做一个'带有数据帧的[ user2357112