计算字符串中的常见字符 Python
Count Common Characters in Strings Python
此代码的输出仍然是 4。但是,输出应该是 3。存在集合交集,因为我认为这是找到答案的关键。答案是 4 而不是 3 的原因来自于 s1 中匹配 s2 的 2 qs 和 1 r 的数量。
s2 = "qsrqq"
s1 = "qqtrr"
counts1=0
counts2=0
letters= set.intersection(set(s1), set(s2))
for letter1 in set(s1):
counts1 += s2.count(letter1)
for letter2 in set(s2):
counts2 += s1.count(letter2)
counts = min(counts1, counts2)
print (counts)
非常感谢任何帮助。
我替换了你原来的代码块
for letter1 in set(s1):
counts1 += s2.count(letter1)
至:
for letter1 in set(s1):
v = s2.count(letter1)
print("{0}:{1}".format(letter1, v))
counts1 += v
输出,是出现次数的字母:
r:1
q:3
t:0
是正确的,字符串 s2
是 qsrqq 你检查 set(s1) 是 set contains r
and q
计数是正确的。同样,如果检查第二个 for 循环,输出为:
q:3
r:1
s:1
因此最小计数为 4。
对每个字母进行计数,并取最小值找出该字母中有多少是两个字符串共有的。然后总结一下,这就是你的答案。
for letter in letters:
counts1 += s1.count(letter)
counts2 += s2.count(letter)
counts += min(counts1, counts2)
counts1 = 0
counts2 = 0
print(counts)
如果你想维护一个共同字符数的计数,你应该使用collections.Counter而不是set
。
from collections import Counter
s2 = 'qsrqq'
s1 = 'qqtrr'
common_letters = Counter(s1) & Counter(s2) # => {'q': 2, 'r': 1}
print(sum(common_letters.values())) # => 3
这是一个不涉及集合的解决方案:
s2 = sorted("qsrqq")
s1 = sorted("qqtrr")
count = 0
while len(s1)>0 and len(s2)>0:
if s1[0] == s2[0]:
count += 1
s1 = s1[1:]
s2 = s2[1:]
elif s1[0] < s2[0]:
s1 = s1[1:]
else:
s2 = s2[1:]
print(count)
这是另一种不使用模块的方法。
sum(1 for i in zip(sorted(list(s1)), sorted(list(s2))) if len(set(i)) < 2)
3
#!/usr/bin/python
s2 = "qsrqq"
s1 = "qqtrr"
counts1=0
counts2=0
letters= set.intersection(set(s1), set(s2))
print ("letters: "+str(letters) + " intersection count: "+str(len(letters)))
for letter1 in set(s1):
print ("letter1 " + str(letter1))
counts1 += 1
for letter2 in set(s2):
print ("letter2 " + str(letter2) )
counts2 += 1
print ("counts1 " + str(counts1) + " counts2 " + str(counts2) )
counts = min(counts1, counts2)
print (counts)
这导致;
[~]$ python /tmp/test.py
letters: set(
['q', 'r']) intersection count: 2
letter1 q
letter1 r
letter1 t
letter2 q
letter2 s
letter2 r
counts1 3 counts2 3
3
分析,2是正确答案(q和r是唯一两个共同的字母),3是任一组唯一值中较低的数字。
def commonCharacterCount(s1, s2):
s=0
for i in list(set(s1)):
count1=0
count2=0
if i in s2:
count1 = s1.count(i)
count2= s2.count(i)
s=s+min(count1,count2)
return(s)
def commonCharacterCount(s1, s2):
return sum( min(s1.count(char), s2.count(char)) for char in (set(s1) & set(s2)))
另一种方式,虽然很晚...
def commonCharacterCount(s1, s2):
count = 0
for i in range(len(s1)):
for j in range(len(s2)):
if(s1[i]==s2[j]):
count +=1
s2 = s2.replace(s2[j],"",1)
break
return count
此代码的输出仍然是 4。但是,输出应该是 3。存在集合交集,因为我认为这是找到答案的关键。答案是 4 而不是 3 的原因来自于 s1 中匹配 s2 的 2 qs 和 1 r 的数量。
s2 = "qsrqq"
s1 = "qqtrr"
counts1=0
counts2=0
letters= set.intersection(set(s1), set(s2))
for letter1 in set(s1):
counts1 += s2.count(letter1)
for letter2 in set(s2):
counts2 += s1.count(letter2)
counts = min(counts1, counts2)
print (counts)
非常感谢任何帮助。
我替换了你原来的代码块
for letter1 in set(s1):
counts1 += s2.count(letter1)
至:
for letter1 in set(s1):
v = s2.count(letter1)
print("{0}:{1}".format(letter1, v))
counts1 += v
输出,是出现次数的字母:
r:1
q:3
t:0
是正确的,字符串 s2
是 qsrqq 你检查 set(s1) 是 set contains r
and q
计数是正确的。同样,如果检查第二个 for 循环,输出为:
q:3
r:1
s:1
因此最小计数为 4。
对每个字母进行计数,并取最小值找出该字母中有多少是两个字符串共有的。然后总结一下,这就是你的答案。
for letter in letters:
counts1 += s1.count(letter)
counts2 += s2.count(letter)
counts += min(counts1, counts2)
counts1 = 0
counts2 = 0
print(counts)
如果你想维护一个共同字符数的计数,你应该使用collections.Counter而不是set
。
from collections import Counter
s2 = 'qsrqq'
s1 = 'qqtrr'
common_letters = Counter(s1) & Counter(s2) # => {'q': 2, 'r': 1}
print(sum(common_letters.values())) # => 3
这是一个不涉及集合的解决方案:
s2 = sorted("qsrqq")
s1 = sorted("qqtrr")
count = 0
while len(s1)>0 and len(s2)>0:
if s1[0] == s2[0]:
count += 1
s1 = s1[1:]
s2 = s2[1:]
elif s1[0] < s2[0]:
s1 = s1[1:]
else:
s2 = s2[1:]
print(count)
这是另一种不使用模块的方法。
sum(1 for i in zip(sorted(list(s1)), sorted(list(s2))) if len(set(i)) < 2)
3
#!/usr/bin/python
s2 = "qsrqq"
s1 = "qqtrr"
counts1=0
counts2=0
letters= set.intersection(set(s1), set(s2))
print ("letters: "+str(letters) + " intersection count: "+str(len(letters)))
for letter1 in set(s1):
print ("letter1 " + str(letter1))
counts1 += 1
for letter2 in set(s2):
print ("letter2 " + str(letter2) )
counts2 += 1
print ("counts1 " + str(counts1) + " counts2 " + str(counts2) )
counts = min(counts1, counts2)
print (counts)
这导致;
[~]$ python /tmp/test.py
letters: set(
['q', 'r']) intersection count: 2
letter1 q
letter1 r
letter1 t
letter2 q
letter2 s
letter2 r
counts1 3 counts2 3
3
分析,2是正确答案(q和r是唯一两个共同的字母),3是任一组唯一值中较低的数字。
def commonCharacterCount(s1, s2):
s=0
for i in list(set(s1)):
count1=0
count2=0
if i in s2:
count1 = s1.count(i)
count2= s2.count(i)
s=s+min(count1,count2)
return(s)
def commonCharacterCount(s1, s2):
return sum( min(s1.count(char), s2.count(char)) for char in (set(s1) & set(s2)))
另一种方式,虽然很晚...
def commonCharacterCount(s1, s2):
count = 0
for i in range(len(s1)):
for j in range(len(s2)):
if(s1[i]==s2[j]):
count +=1
s2 = s2.replace(s2[j],"",1)
break
return count