在Python中查找2个字符串之间的常用字母

时间:2014-09-22 16:42:44

标签: python string letters

对于家庭作业,我必须输入2个用户输入的字符串,并找出共有多少个字母(在两个字符串的相同位置),以及查找常用字母。例如,对于两个字符串& #39;猫'和'鼠标有两个共同的字母位置(在这种情况下是位置2和3),而普通字母也是2,因为' a'被发现是一个' t'也被发现了..

所以我制作了一个程序并且工作正常,但后来我的老师用更多的例子更新了作业,特别是重复字母的例子,我的程序不适用于此...例如,使用字符串&# 39; ahahaha'和huhu' - 相同位置有0个常用字母,但它们之间有3个常用字母(因为字符串2中的' h'字符串1中出现三次......)

我的整个问题是,如果" h"我无法弄明白如何计算在第一个字符串中多次出现,以及我不知道如何不查看SECOND' h'在huhu因为它应该只计算独特的字母,所以整体常用的字母数应该是2 ..

这是我目前的代码:

S1 = input("Enter a string: ")
S2 = input("Enter a string: ")
i = 0
big_string = 0
short_string = 0
same_letter = 0
common_letters = 0

if len(S1) > len(S2):
    big_string = len(S1)
    short_string = len(S2)
elif len(S1) < len(S2):
    big_string = len(S2)
    short_string = len(S1)
elif len(S1) == len(S2):
    big_string = short_string = len(S1)

while i < short_string:
    if (S1[i] == S2[i]) and (S1[i] in S2):
        same_letter += 1
        common_letters += 1
    elif (S1[i] == S2[i]):
        same_letter += 1
    elif (S1[i] in S2):
        common_letters += 1
    i += 1

print("Number of positions with the same letter: ", same_letter)
print("Number of letters from S1 that are also in S2: ", common_letters)

所以这段代码适用于没有常用字母的字符串,但是当我尝试将它用于&#34; ahahaha&#34;和&#34; huhu&#34;我得到0个常用位置(有意义)和2个常用字母(当它应该是3时)..我认为如果我尝试添加以下内容可能会有效:

while x < short_string:
    if S1[i] in S2[x]:
        common_letters += 1
    else:
        pass
    x += 1

然而,这也不起作用......

我不是要求直接回答或代码片段,因为我想自己做,但我只需要一些提示或想法如何做到这一点..

注意:我不能使用我们在课堂上没有学过的任何功能,而且在课堂上我们只完成了基本的循环和字符串..

5 个答案:

答案 0 :(得分:1)

您需要一个像multidict这样的数据结构。据我所知,标准库中最相似的数据结构是来自Counter的{​​{1}}。

对于简单的频率计数:

collections

使用索引计数:

>>> from collections import Counter
>>> strings = ['cat', 'rat']
>>> counters = [Counter(s) for s in strings]
>>> sum((counters[0] & counters[1]).values())
2

对于您的示例>>> counters = [Counter(zip(s, range(len(s)))) for s in strings] >>> sum(counters[0] & counters[1].values()) 2 ahahaha,您应该分别获得huhu2,因为我们得到两个0但位置错误。

由于您无法使用高级构造,因此您只需要使用数组模拟h

  • 创建26个元素数组
  • 循环遍历字符串并更新每个字母的相关索引
  • 同时在数组上循环并将各个索引的最小值相加。

答案 1 :(得分:1)

这是一个较短的版本:

def gen1(listItem):
    returnValue = []
    for character in listItem:
        if character not in returnValue and character != " ":
            returnValue.append(character)
    return returnValue

st = "first string"
r1 = gen1(st)
st2 = "second string"
r2 = gen1(st2)

if len(st)> len(st2):
    print list(set(r1).intersection(r2))
else:
    print list(set(r2).intersection(r1))

注意: 这是一个非常古老的帖子,但是由于它有了新的活动,我发布了我的版本。

答案 2 :(得分:0)

由于您无法使用数组或列表,

也许尝试将每个常见字符添加到var_string然后测试 如果c不在var_string中: 在递增公共计数器之前,您不会多次计算相同的字符。

答案 3 :(得分:0)

你只是得到了&#39; 2&#39;因为你只会查看ahahaha中的4个字符(因为huhu,最短的字符串,只有4个字符长)。更改while循环以改为big_string,然后将(len(S2) > i) and添加到两个条件测试中;最后一个测试执行in,因此不会导致索引长度出现问题。

注意:以上所有都隐含地假设len(S1)&gt; = len(S2);这应该很容易确保,使用条件和赋值,它会简化代码的其他部分来实现这一点。您可以完全用以下内容替换第一个块:

if (len(S2) > len(S1)): (S2, S1) = (S1, S2)
big_string = len(S1)
short_string = len(S2)

答案 4 :(得分:0)

我们可以通过在另一个内部使用一个for循环来解决这个问题,如下所示

int y=0;
for(i=0;i<big_string ;i++)
   {
     for(j=0;j<d;j++)
        {
           if(s1[i]==s2[j])
           {y++;}
        }

如果你输入'ahahaha'和'huhu'这个代码的第一个字符是big 字符串'a'进入第一个foor循环时。当它进入第二个for循环    它需要小字符串'h'的第一个字母并比较它们,因为它们不是 等于y不递增。在下一步中,它出现在第二个循环中但是 保持在第一个循环,所以它考虑大字符串'a'和。的第一个字符 将它与小字符串'u'的第二个字母进行比较,因为'j'增加了偶数  在这种情况下,它们都不相等,y保持为零。 Y递增 以下情况: -

  1. 当它比较大字符串'h'的第二个字母和第一个字符串的小写字母y增加一次i,e y = 1;
  2. 当它比较大字符串'h'的第四个字母和第一个字符串y的小写字母再次递增i时,e y = 2;
  3. 当它比较大字符串'h'的第六个字母和第一个字符串y的小写字母再次递增i时,e y = 3;
  4. 最终输出为3.我认为这就是我们想要的。