在python中将字符串转换为二进制表示

时间:2014-02-17 02:31:37

标签: python

我想根据元音和辅音的内容为单词创建二进制值,其中元音的值为“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}

我正在考虑一个不涉及循环内循环的解决方案......

3 个答案:

答案 0 :(得分: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是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)
...