Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 迭代两个字符串并计算重复的字母_String_Python 3.x_Dictionary - Fatal编程技术网

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"