对于家庭作业,我必须输入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
然而,这也不起作用......
我不是要求直接回答或代码片段,因为我想自己做,但我只需要一些提示或想法如何做到这一点..
注意:我不能使用我们在课堂上没有学过的任何功能,而且在课堂上我们只完成了基本的循环和字符串..
答案 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
,您应该分别获得huhu
和2
,因为我们得到两个0
但位置错误。
由于您无法使用高级构造,因此您只需要使用数组模拟h
。
答案 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递增 以下情况: -
最终输出为3.我认为这就是我们想要的。