2017-05-30 1 views
0

La sortie de ce code continue à être 4. Cependant, la sortie devrait être 3. L'intersection définie est présente parce que je crois que c'est la clé vers la réponse. Le raisonnement pour la réponse étant 4 au lieu de 3 vient du nombre de 2 qs et 1 r qui correspondent à s2 dans s1.Compter les caractères communs dans les chaînes Python

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) 

Toute aide est très appréciée.

+1

qu'est-ce que vous essayez d'atteindre? –

+0

Pouvez-vous expliquer pourquoi 3 est la bonne réponse? – Mureinik

+0

En s1, il y a 2 qs et 1 r qui correspondent à s2. Je veux juste que la réponse produise ceci. –

Répondre

3

Si vous souhaitez conserver un décompte du nombre de caractères en commun, vous devez utiliser collections.Counter au lieu de 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 
1

J'ai remplacé votre morceau de code d'origine

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 

Il produit, il est la lettre avec un nombre d'occurrence:

r:1 
q:3 
t:0 

Il est exact, chaîne s2 est qsrqq et vous vérifiez ensemble (s1) qui contient r et q Les comptes sont corrects. De même, si la vérification de la 2ème boucle for, les sorties sont: par conséquent, le nombre minimum

q:3 
r:1 
s:1 

est 4.

0

Faites un compte pour chaque lettre, et prendre le minimum pour savoir combien de cette lettre sont communes aux deux chaînes. Puis résumez cela, et c'est votre réponse.

for letter in letters: 
    counts1 += s1.count(letter) 
    counts2 += s2.count(letter) 
    counts += min(counts1, counts2) 
    counts1 = 0 
    counts2 = 0 
print(counts) 
1

Voici une solution qui ne comporte pas de jeux:

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) 
+0

Votre réponse est correcte. Cependant, j'aime la simplicité de la meilleure réponse. –

1

Voici une autre façon de le faire sans utiliser des modules.

sum(1 for i in zip(sorted(list(s1)), sorted(list(s2))) if len(set(i)) < 2) 

3 
1
#!/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) 

Il en résulte;

[~]$ 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 

Analyse, 2 est la bonne réponse (q et r sont les seules lettres communes à la fois), 3 est le nombre inférieur de deux ensembles de valeurs uniques.

+0

gosh J'aime les déclarations d'impression –