J'ai donc un problème intéressant.
J'essaie d'écrire un mot de jeu, et j'ai besoin de savoir quelles lettres que j'ai utilisées et que je n'ai pas faites. Jusqu'à présent, j'ai le code ci-dessous: p> Ce que je cherche un moyen simple d'éliminer les lettres dans les deux, mais laissez des doublons si nécessaire. P >
x = "aa" code> et y = "a" code>, alors le résultat est "A" code>, pas "" code>. Cela empêche l'utilisation des ensembles, je pense. Li>
trié () code> IT. LI>
ol>
3 Réponses :
Vous pouvez utiliser comme une démonstration de ce qui se passe: p> collections.Counter code> des objets, qui peuvent être soustraits les uns des autres: >>> c1 = collections.Counter("hello world")
>>> c2 = collections.Counter("hey worlds")
>>> c1 - c2
Counter({'l': 2, 'o': 1})
>> (c1 - c2).elements()
['l', 'l', 'o']
J'ai peut-être lu trop? Mais cela ressemblait à ce qu'il voulait conserver la commande (+1) pour le comptoir de la même manière
La commande de sortie n'est pas importante, je mettrai à jour les règles pour l'énoncer.
@Joranbeasleas: Non, sinon il n'aurait pas trié chaque chaîne pour commencer avec
Voici une implémentation basée sur des collections.Conter: P> Collections.Counter code> ne laissera pas de comptage aller sous zéro si vous utilisez l'opérateur - code>. Toutefois, si vous utilisez C.Subrent (D), il vous permettra de le faire. En outre, lors de l'utilisation de C.Elements (), les valeurs avec des comptes négatifs sont ignorées. cz = collections.Counter(cy) # because c.subtract(..) modifies c
cz.subtract(cx)
for letter, count in cz.iteritems():
if count == cy[letter]: # in the case that there were none of letter in x
assert False
Ne gère pas d'échec sur les lettres dans y code> qui ne sont pas dans x code>
Ah, bonne prise. J'ai mal interprété cette exigence. Dans ce cas, l'utilisation de la combinaison de CX-CY et CY-CX semble être la voie à suivre.
@ J.davidsmith: votre solution pourrait gérer cela en faisant si (compte) <0: élever ... Code> Je fais comme le mien, mais je pense que cela peut être plus efficace car il n'effectue qu'une seule soustraction . (Cependant, l'utilisation d'une concaténation de chaîne est un peu plus lente que "". Joindre code>, alors qui sait).
@Davidrobinson: si compte <0: élever ... code> échoue dans le scénario où String X a n de lettre L, tandis que y a une m de lettre l où n
Bâtiment sur la réponse de David Robinsons:
import collections.Counter as C
def remove_common(x,y):
s1,s2=filter(str.isalpha, x.lower()),filter(str.isalpha, y.lower())
c1,c2 = C(s1),C(s2)
if any(c2-c1):
assert False
return list((c1-c2).elements())
>>> remove_common('hi there','hi')
['h', 'r', 'e', 'e', 't']
>>> x,y='Lets chat about code','that cool cat'
>>> remove_common(x,y)
['u', 's', 'b', 'e', 'e', 'd']
>>> remove_common('hi','ho')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in remove_common
AssertionError
Pourriez-vous s'il vous plaît ajouter des exemples d'entrée / sortie supplémentaires?
@Haidro 2 Plus ajouté.
@Haidro: Je ne comprends pas votre premier exemple: pourquoi n'est-ce pas
bcdeloostu code>? Qu'est-il arrivé auo code> S, lel code> et le troisièmet code>? Dans la deuxième exférence, pourquoi lei code> soustrait-il?Vous dites des duplicats importantes, mais votre premier exemple a des occurrences en double de «A». Voulez-vous dire adjacents i> duplicats?
@ 2RS2TS: cette partie a du sens pour moi, car il y a deux
A code> s dans les premier et 2A code> S dans la secondeSi une lettre est dans Y, ce n'est pas dans X, il devrait dire cela fort. code> dans votre premier exemple,v code> est dans Y mais pasx code> x code> . Pourquoi ne l'avez-vous pas "disant quoi que ce soit fort"?@Haidro whoops vous avez raison, le premier exemple est faux, je devais éliminer les lettres à la main. Maintenant, vous pouvez comprendre mon dilemme!
Je ne sais pas pourquoi vous m'adressez: p. C'était @davidrobinson qui l'a pointé, et je pense qu'il me faisait accidentellement piquer
@Haidro: Oh, je suis vraiment désolé. On dirait que tout le monde vous pique accidentellement.
@Davidrobinson hah il va bien