String 迭代两个字符串并计算重复的字母
我通过命令行接受两个字符串 我想要的是String 迭代两个字符串并计算重复的字母,string,python-3.x,dictionary,String,Python 3.x,Dictionary,我通过命令行接受两个字符串 我想要的是 如果第一个字符串包含的z多于第二个字符串,则第一个字符串获胜 如果他们有相同的号码 如果是z,则y最多的字符串获胜 如果它们有相同数量的y,那么x的数量 决定胜利者等。 如果它们包含相同数量的z,y。。。。a的话,那就是平局了 没有赢家 我计划做的是 创建一个包含所有字母的字典,并指定递增值,如 alphabets = dict(a=1, b=2, c=3, ... ,y=25, z=26) 并将其值乘以字母重复的次数 For example
- 如果第一个字符串包含的z多于第二个字符串,则第一个字符串获胜
- 如果他们有相同的号码 如果是z,则y最多的字符串获胜
- 如果它们有相同数量的y,那么x的数量 决定胜利者等。
- 如果它们包含相同数量的z,y。。。。a的话,那就是平局了 没有赢家
alphabets = dict(a=1, b=2, c=3, ... ,y=25, z=26)
并将其值乘以字母重复的次数
For example, python myprogram.py zzza zzza
string1: zzza and string2: zzza
In string1, Z is repeated 3 times and a is repeated once.
In string2, Z is repeated 2 times, b and a is repeated once.
So, (26*3) + (2*1) and (26*2) + (2*1) + (1*1)
具有最大数字的字符串将获胜。但是,它并不总是给出正确的答案。
(string1:zzza和string2:ZYX条件失败)
输入:
python myprogramm.py qwwweq asdnnn
输出:
字符串有效
{'e':1,'q':2,'w':3}{'d':1,'a':1,'n':3,'s':1}合并的数据
应该采取什么办法?
谢谢您的方法不起作用,因为26个
a
字符的得分与一个z
字符的得分相同;26*1==1*26
相反,您应该将其视为排序问题,按照字母计数进行排序。对每个单词中的字母进行计数,然后将计数按逆字母顺序作为一个元组,让Python使用max()
选择获胜者。Python序列按字典顺序进行比较;带有[3,2]
的列表在[3,1]
之后排序,因为第二个数字在第一个数字中较大max()
会在第二个选项中选择它
计数是通过以下步骤完成的:
letter_counts()
生成一个26个整数的列表,每个整数都是字母z
到a
的计数。这可以在没有字典的情况下完成。作为预处理的一部分创建字典是额外的开销。
我们可以在两个字符串中逐个检查从
(z..a)
开始的每个字母的计数。如果有一个最大值,我们可以打破循环并宣布获胜。这比使用字典解决这个问题要有效得多
from string import ascii_lowercase
str1="hellozzzz"
str2="yellozzzz"
winner=""
for ele in reversed(ascii_lowercase):
diff=str1.count(ele)-str2.count(ele)
if(diff>0):
winner=str1
break
elif (diff<0):
winner=str2
break
print winner if(winner) else "It's a tie"
从字符串导入ascii\u小写
str1=“hellozzz”
str2=“yellozzz”
winner=“”
对于反向的ele(ascii_小写):
差异=str1.count(ele)-str2.count(ele)
如果(差异>0):
获胜者=str1
打破
elif(DiffThank batMan。我检查了各种字符串,程序失败了几次。输入:str1=“Yellozzzzz”str2=“Hellozzzzz”输出:根据条件,Hellozzzzz是赢家,Yellozzzzz应该是赢家!!一个错误。如果你在我为str1设置字典的第一个for循环中检查,我提到了d[l]在其他情况下为=0。我已更正它do d[l]=1,更新了答案,它工作正常。这与我的答案完全相同,只是没有计数器对象和max()
。我想说,这更有效
,因为它不预处理所有字母的计数,只要满足条件,就会停止
,而不需要检查和存储更多字母的计数:)@batman:不,计数已经完成,是O(K),其中K是输入的长度。只有将计数整理成一个列表在这里是短路的。这样的数字最多可以查到26个,所以要加快查找速度的机会非常少。在我的答案中进行比较的C代码可能仍然会超过一个比较,其中一个字符串的z字符比另一个多。嘿@batMan,我不知道你在说什么。
from collections import Counter
from string import ascii_lowercase
def letter_counts(word):
counts = Counter(word)
return [counts.get(l, 0) for l in reversed(ascii_lowercase)]
lcounts1 = letter_counts(word1)
lcounts2 = letter_counts(word2)
if lcounts1 == lcounts2:
# tie
print('No winner')
else:
_, winner = max((lcounts1, word1), (lcounts2, word2))
print(winner)
from string import ascii_lowercase
str1="hellozzzz"
str2="yellozzzz"
winner=""
for ele in reversed(ascii_lowercase):
diff=str1.count(ele)-str2.count(ele)
if(diff>0):
winner=str1
break
elif (diff<0):
winner=str2
break
print winner if(winner) else "It's a tie"