2012-10-20 131 views
1

我想解決類似於下面的更一般的問題。在下面,我得到了vow_array,它表示在一些文本中存在一些元音,比如發送給我的程序。我需要打印每個元音的存在爲0或1.python檢查列表元素的存在

ch_a = 0 
ch_e = 0 
ch_i = 0 
ch_o = 0 
ch_u = 0 

# vow_array is generated at runtime; here is an example 
vow_array = ['a', 'o', 'u'] 

if 'a' in vow_array: 
    ch_a = ch_a + 1 
if 'e' in vow_array: 
    ch_e = ch_e + 1 
if 'i' in vow_array: 
    ch_i = ch_i + 1 
if 'o' in vow_array: 
    ch_o = ch_o + 1 
if 'u' in vow_array: 
    ch_u = ch_u + 1 

print ch_a, ch_e, ch_i, ch_o, ch_u 

我認爲這段代碼太長,容易出錯。有沒有更緊湊的寫作方式?另外,如果我必須爲字母表中的所有「字母」執行此操作,則我不想重複該代碼。

回答

6

當然。

如果你有相同的前綴(ch_ach_e,...),你需要使用字典或列表,以它們分組變量:

vowels = { 
    'a': 0, 
    'e': 0, 
    'i': 0, 
    'o': 0, 
    'u': 0 
} 

vowel_array = ['a', 'o', 'u'] 

for vowel in vowels.keys(): 
    if vowel in vowel_array: 
     vowels[vowel] += 1 

print vowels 

一個更Python的解決辦法是什麼像這樣:

>>> from collections import Counter 
>>> 
>>> letters = 'i am a sentence' 
>>> Counter(letters) 
Counter({' ': 3, 'e': 3, 'a': 2, 'n': 2, 'c': 1, 'i': 1, 'm': 1, 's': 1, 't': 1}) 
+0

+1 - 數據結構是缺少的,「collections.Counter」在這裏是正確的。 –

+0

美麗,謝謝!也感謝其他人,對解決方案也有同樣的想法。 – user1487178

0

試試這個:

ch_dict = {'a':0,'e':0,'i':0,'o':0,'u':0} 
vow_array = ['a','o','u'] 
for d in vow_array: 
    ch_dict[d] = ch_dict[d] + 1 

print(ch_dict) 
1

相同的思路@Blender的,只是初始化字典不同的方式(你可以用Python中的字典修真> 2.7做到這一點):

>>> vowels = dict((v, 0) for v in 'aeiou') 
>>> vow_array = ['a', 'o', 'u'] 
>>> for vow in vow_array: 
... vowels[vow] += 1 
>>> vowels 
{'e': 0, 'i': 0, 'o': 1, 'u': 1, 'a': 1} 

如果排序是一個問題:

>>> for value in sorted(vowels): 
... print '{0}: {1}'.format(value, vowels[value]) 
... 
a: 1 
e: 0 
i: 0 
o: 1 
u: 1 
相關問題