2014-02-17 2 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

Откуда берутся «каждый» или «номер_значения»? – user2357112

+1

Нет решения, которое не использует две петли. – placeybordeaux

+0

'dictify = {w:" ". Join ('0', если c в 'aeiouAEIOU' else '1' для c в w) для w в common_words}' – mshsayem

ответ

2

Код, который вы опубликовали, не работает, потому что все слова имеют одинаковый список binary_value. (Это также не работает, потому что number_value и each никогда не определены, но мы будем делать вид, эти переменные сказал binary_value и word вместо этого.) Определите новый список для каждого слова:

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 не различает «это ИНТ основание 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) 
... 
Смежные вопросы