2017-10-11 82 views
1

如果我有一個列表更簡潔的方式來過濾列表?

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] 

很明顯,它不實現目前這種方式,而不是當前的方法相對冗長?爲什麼不能簡化?

+0

你不能做一個'帶有數據幀的[<6]。 – user2357112

回答

1

您有上面最簡單的方法。但是,您可以使用以下內容

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

這看起來不錯,但我仍然對列表理解有一個軟弱的地方。

+2

不要在這樣的情況下使用lambda,它比列表理解效率低。 –

+2

我同意。列表比較是前進的方向。我只是想我給A.n.other其他方法。 – Chinny84

0

是的,可以構建python語言,以便a[<6]完成您想要的過濾,但是接下來每個python程序員和每個python編譯器都必須學習這種特殊語法,以在一些特殊情況下保存一些源代碼: >,> =,==,< =,<。

熊貓做的事情就像你展示的那樣,但它是爲大量數值分析而建立的,所以語法糖可能更值得花費。此外,熊貓傾向於提供大量受R語言啓發的語法糖,因此它不是非常習慣的python。

+0

作爲實際開發編程語言錯綜複雜的新手,請原諒我是否會變得厭惡或無知,但...... 無法處理任何代碼處理切片列表被編寫來解釋任何條件聲明,包括布爾組合?這看起來像是一個相當普遍和廣泛的應用,並且程序員不難學習比當前的過濾習慣用法更直接和更容易學習的語法(儘管這對於列表理解來說是有用的介紹)。 – James

+0

獲得編譯器和人都能理解的語法總是很難,而不會使其變得非常複雜。例如:爲什麼不用'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

+0

Thx @combinatorist。 – James

1

你不能正是你要求的語法,但如果你想創建自己的列表類,你可以擁有一個同樣簡潔:

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] 
相關問題