我想根据元音和辅音的内容为单词创建二进制值,其中元音的值为“0”,辅音的值为“1”。
例如,'haha'将表示为1010,hahaha表示为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 :(得分: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没有区分"这个int是base 2"或者#34;这个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)
答案 1 :(得分: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'}
答案 2 :(得分: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 = {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)
...