2014-07-10 50 views
1

說我有這樣的:我可以向for循環添加條件嗎?

array = ['apple', 'banana', 'carrot', 'dragonfruit', 'eggplant'] 

現在我想這個數組,其中的值不以元音開始打印的值。

banana 
carrot 
dragonfruit 

我能做到這一點:

for str in array: 
    if str[0].lower() not in ('a','e','i','o','u'): 
     print str 

什麼我不知道,如果是有說法類似的方式Python的:

for str in array where str[0].lower() not in ('a','e','i','o','u'): 
+2

名單COMPRE hensions很棒,但沒有什麼* unpythonic *關於必須有一個單獨的'for'循環和'if'條件。 **我會說你的原始解決方案更好**,因爲它更清晰,更簡單,更具可讀性 - 但那是什麼使這成爲一個非常主觀的問題。 –

回答

5

你知道str.startswith接受一個前綴元組嗎?

實施

for fruit in (elem for elem in array 
       if not elem.startswith(('a','e','i','o','u'))): 
    print fruit 

輸出

banana 
carrot 
dragonfruit 
+0

哦,我不知道! –

4
for str_ in (s for s in array if s[0].lower() not in 'aeiou'): 
    print(str_) 

請勿使用str作爲它會隱藏內置的字符串構造函數。

這就是說,這看起來更像是一個正則表達式而不是列表comp。

import re 

words = ['apple', 'banana', 'carrot', 'dragonfruit', 'eggplant'] 
pat = re.compile(r''' 
     \b   # Begin a word 
     [^aeiou\s]\w* # Any word that doesn't begin with a vowel (or a space) 
     \b   # End a word''', re.X) 
matches = re.findall(pat, ' '.join(words), re.I) 
print(matches) 

沒關係,我不能得到這個工作,沒有時間在此刻與它弄髒。我在正則表達式:(失敗

這困擾了我太多的離開是錯誤的。我固定它。

+0

發電機+1; 'str_'爲±0,而不是''水果'給定的起始數組(應該可能被稱爲'水果')是的,我有一個命名迷信,但不以爲恥。 – msw

+1

@msw同意了,但我使用'str_'來說明爲什麼不使用'str'以及如何避免使用內建函數(如果你想要的話)(有時候你確實想調用'class',所以你叫它例如在'BeautifulSoup'中 –

2

startswith(( 'A', 'E', 'I', 'O', 'U' )basestring.join()列表理解始終是你的好朋友是Python的:)

您可以使用此:

no_vowels = [str for str in array if not str.startswith(('a','e','i','o','u'))] 
for nv in no_vowels: 
    print nv 

或本:

print '\n'.join([str for str in array if not str.startswith('a','e','i','o','u'))] 
+0

老實說,「pythonic」的方式是用水果的話來說:如果不是fruit.startswith((''','e','i','o' ,'u')):print(fruit)'沒有將一個龐大的列表comp與一個字符串連接串在一起,但是OP明確地不想這樣做。 –

2

您可以使用list comprehension其類似地讀給你在你的問題提出的。

請注意'str for str'開頭和'if'而不是'where'。

還要注意,字符串是可迭代的,因此您可以將if語句簡化爲: if x [0]。下()不在「AEIOU」

因此,一個簡單的解決方案可以是:

all_fruit = ['apple', 'banana', 'carrot', 'dragonfruit', 'eggplant'] 

#filter out fruit that start with a vowel 
consonant_fruit = [fruit for fruit in all_fruit if fruit[0].lower() not in 'aeiou'] 

for tasty_fruit in consonant_fruit: 
    print tasty_fruit 

或者,也可以使用信號發生器表達式,其是多個存儲器高效的,在這個例子中,唯一的變化是「[]」以 '()'

all_fruit = ['apple', 'banana', 'carrot', 'dragonfruit', 'eggplant'] 

#filter out fruit that start with a vowel 
consonant_fruit = (fruit for fruit in all_fruit if fruit[0].lower() not in 'aeiou') 

for tasty_fruit in consonant_fruit: 
    print tasty_fruit 

還有一個filter內置:

all_fruit = ['apple', 'banana', 'carrot', 'dragonfruit', 'eggplant'] 

for tasty_fruit in filter(lambda fruit: fruit[0].lower() not in 'aeiou', all_fruit): 
    print tasty_fruit