2010-02-03 12 views
5

在Perl中,一個可以做以下什麼是Perl模式的python等價物來追蹤是否已經看到了某些東西?

for (@foo) { 
    # do something 
    next if $seen{$_}++; 
} 

我希望能夠做到在Python等效,也就是如果已經執行一次跳過塊。

+2

你知道如何跳過Python中循環的當前迭代,是嗎?你還知道如何在Python中使用哈希?以及如何使用條件?你可以把它放在一起,你有你的解決方案。 – 2010-02-03 00:34:19

+0

匿名,不,我不這就是我問的原因。 「接下來,如果$ seen {$ _} ++」很好地表達了我正在嘗試做的事情,並且似乎python對等物看起來不夠優雅。儘管itertools似乎可能適合每個Greg的賬單。 – jnman 2010-02-03 00:44:56

+0

也許「優雅」是指「簡潔」還是「簡潔」?沒關係,簡潔/簡潔意味着優雅,因爲美麗是旁觀者的眼睛,但是當你向他人請求幫助時,請避免使用主觀條件;你只有你知道什麼是你的優雅。 – tzot 2010-02-03 01:41:58

回答

11
seen = set() 
for x in foo: 
    if x in seen: 
     continue 
    seen.add(x) 
    # do something 

有關更多信息,請參閱set文檔。

此外,在itertools模塊文檔底部的例子包含unique_everseen發電機,您可以使用這樣的:

for x in unique_everseen(foo): 
    # do something 
+0

謝謝。看起來像unique_everseen可能適合帳單,雖然它似乎被列爲可選配方,而不是模塊的一部分。 – jnman 2010-02-03 00:48:32

+0

jnman,不要讓任何人強迫你的Python。我的意思是,從你選擇撰寫評論的方式來看,很明顯你發現Python至多是一個必要的罪惡(可能這是一份工作要求),而且它的圖書館嚴重缺乏(與CPAN的宏偉背道而馳)。 – tzot 2010-02-03 01:51:18

+0

使用perl比python更舒適。但是,由於我目前正在處理的一些東西,我必須使用python來代替問題。看起來這個特殊的perl(ism)對我來說是非常有用的,我有點驚訝於python中沒有相應的「簡潔」版本(用你的話)。 – jnman 2010-02-03 02:47:23

1
seen={} 
for item in foo: 
    if seen.has_key(item): 
     seen[item]+=1 
     continue # continue is optional, just to illustrate the "next" in Perl 
    else: 
     seen[item]=1 
+0

或者'from collections import defaultdict; seen = defaultdict(int);對於foo中的物品:看過[item] + = 1;如果看到[item]> 1:continue; #rest代碼「(當然有合適的縮進)。 – 2010-02-03 05:05:10

+0

是的,+1。但我想我還是老派,所以這適用於版本<2.4+ – ghostdog74 2010-02-03 05:19:03

1

如果你不關心的東西的順序foo,而且只有獨特的項目被迭代了,那麼解決方案是更簡單。

for x in set(foo): 
    do something 
相關問題