2014-02-17 52 views
0

我想根據元音和輔音的內容爲單詞創建二進制值,其中元音的值爲'0',輔音的值爲'1'。將字符串轉換爲python中的二進制表示

例如,「哈哈」將被表示爲1010,作爲哈哈哈101010.

common_words = ['haha', 'hahaha', 'aardvark', etc...] 

dictify = {} 

binary_value = [] 

#doesn't work 
for word in common_words: 
    for x in word: 
     if x=='a' or x=='e' or x=='i' or x=='o' or x=='u': 
      binary_value.append(0) 
      dictify[word]=binary_value 
     else: 
      binary_value.append(1) 
      dictify[word]=binary_value 

- 隨着此我在所得字典收到太多二進制位數:

>>>dictify 
{'aardvark': [0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1,...} 

期望輸出:

>>>dictify 
{'haha': 1010,'hahaha': 101010, 'aardvark': 00111011} 

我在想一個解決方案,不涉及循環內的循環...

+0

'each'或'number_value'從哪裏來? – user2357112

+1

沒有使用兩個循環的解決方案。 – placeybordeaux

+0

'dictify = {w:「」。join'('0'if'in'aeiouAEIOU'else'1'for c in w)for w in common_words}' – mshsayem

回答

2

您發佈的代碼不起作用,因爲所有單詞共享相同的binary_value列表。 (這也不起作用,因爲number_valueeach從來沒有定義,但我們會假裝這些變量表示binary_valueword代替。)定義一個新的列表,每個字:如果你想輸出到

for word in common_words: 
    binary_value = [] 
    for x in word: 
     if x=='a' or x=='e' or x=='i' or x=='o' or x=='u': 
      binary_value.append(0) 
      dictify[word]=binary_value 
     else: 
      binary_value.append(1) 
      dictify[word]=binary_value 

看起來像00111011而不是一個列表,你需要做一個字符串。 (你可以做一個int,但隨後會看起來像59,而不是00111011。Python不區分「這個int是基地2」或「本INT有2個前導零」。)

for word in common_words: 
    binary_value = [] 
    for x in word: 
     if x.lower() in 'aeiou': 
      binary_value.append('0') 
     else: 
      binary_value.append('1') 
    dictify[word] = ''.join(binary_value) 
2

user2357112解釋你的代碼。這只是另一種方式:

>>> common_words = ['haha', 'hahaha', 'aardvark'] 
>>> def binfy(w): 
     return "".join('0' if c in 'aeiouAEIOU' else '1' for c in w) 

>>> dictify = {w:binfy(w) for w in common_words} 
>>> dictify 
{'aardvark': '00111011', 'haha': '1010', 'hahaha': '101010'} 
1

這似乎是一個翻譯表的工作。假設你輸入字符串的所有ASCII(和它很可能還是到底什麼是元音變模糊的定義),你可以定義一個轉換表這樣*:

# For simplicity's sake, I'm only using lowercase letters 
from string import lowercase, maketrans 
tt = maketrans(lowercase, '01110111011111011111011111') 

通過上面的表格,問題就變得平凡:

>>> 'haha'.translate(tt) 
'1010' 
>>> 'hahaha'.translate(tt) 
'101010' 
>>> 'aardvark'.translate(tt) 
'00111011' 

鑑於這種解決方案,您可以用修真建立dictify得很乾脆:

dictify = {word:word.translate(tt) for word in common_words} #python2.7 
dictify = dict((word, word.translate(tt)) for word in common_words) # python 2.6 and earlier 

*這也可以使用Python 3做,但你必須要使用的字節我而不是字符串:

from string import ascii_lowercase 
tt = b''.maketrans(bytes(ascii_lowercase, 'ascii'), b'01110111011111011111011111') 
b'haha'.translate(tt) 
... 
相關問題