用于比较2个字符串中元音的存在的功能

时间:2015-12-29 12:07:47

标签: python python-2.7

我写了一个比较2个字符串的函数脚本,并告诉我们是否有相同的元音(种类和数字)。

例如:

sameVowels('aabcefiok','xcexvcxaioa') should return `true`

sameVowels('aabcefiok','xcexvcxaioia')应该返回false

这是我基于列表的尝试。它不能很好地工作,我不知道为什么;在这个具体示例中,它为两者返回true

def sameVowels(s1, s2):
L1=[]
L2=[]
L_vowles=['a','e','i', 'o','u','A','E','I','O', 'U'] #dont know how to use str.upper/lower on lists...

for i in s1:
    if i in L_vowles:
        L1.append(i)
for i in s2:
    if i in L_vowles:
        L2.append(i)


for i in L1:
    L1.count(i)

for i in L2:
    L2.count(i)

return L1.count(i)== L2.count(i)

如你所见,我创建了一些愚蠢的名单--L_vowels ......

我考虑使用sets,但我认为它不会有用,因为我不能用它进行任何计数。

1.我的尝试怎么了?

  1. 使用dictionary
  2. 解决问题的想法

    谢谢!

4 个答案:

答案 0 :(得分:5)

只需使用生成器表达式并排序:

def vowels(x):
    return (i for i in x if i.lower() in "aeiou")

def same_vowels(a, b):
    return sorted(vowels(a)) == sorted(vowels(b))

答案 1 :(得分:2)

将两个字符串小写,将其过滤到元音,然后使用import collections def same_vowels(s1, s2): return collections.Counter(letter for letter in s1.lower() if letter in 'aeiou' ) == collections.Counter(letter for letter in s2.lower() if letter in 'aeiou') 并比较结果:

>>> same_vowels('aabcefiok','xcexvcxaioa')
True

结果:

[Error: Module version mismatch. Expected 46, got 14. This generally implies that leveldown was built with a different version of node than that which is running now.  You may try fully removing and reinstalling PouchDB or leveldown to resolve.]

答案 2 :(得分:1)

回答你的第一个问题

def sameVowels(s1, s2):
    L1=[]
    L2=[]
    L_vowles=['a','e','i', 'o','u','A','E','I','O', 'U'] #dont know how to use str.upper/lower on lists...

    for i in s1:
        if i in L_vowles:
            L1.append(i)
    for i in s2:
        if i in L_vowles:
            L2.append(i)

你的代码在这里很好

从现在开始,它开始毫无意义。你写了LI.count(i),但那什么都不做。然后比较LI.count(i) == L2.count(i),它只会比较分配给i的最后一个值的计数,而不是我假设的所有值的计数。为了纠正这个问题,你应该有类似的东西

    if (len(L1) == len(L2)):
        for i in L1:
            if (L1.count(i) != L2.count(i)):
                return false
        return true
    return false

这样,你就比较了所有的值并在两种情况下返回false:首先,如果列表的长度不同,即其中一个有元音而另一个没有元音;第二,如果他们的数量不同(我实际上并不理解为什么他们的数量应该相同,但这是你的方法)

关于第二个问题..

您可以通过构建将元音存储为key并将其计为value的字典来实现。然后,比较两个dict构建的是否相等。

答案 3 :(得分:0)

据我所知,每个元音的数量也需要考虑在内。以下是我的看法:

def getVowelsOf(s):
    vowels = set(['a', 'e', 'i', 'o', 'u'])
    sVowels = {}
    for c in s.lower():
        if c in vowels:
            if c in sVowels:
                sVowels[c] = sVowels[c] + 1
            else:
                sVowels[c] = 1
    return sVowels

def sameVowels(s1, s2):
    s1Vowels = getVowelsOf(s1)
    s2Vowels = getVowelsOf(s2)
    return cmp(s1Vowels, s2Vowels) == 0