Je veux réduire le nombre de "les" mots de a par 2. Mais ce code ne semble pas fonctionner. Je ne peux pas comprendre pourquoi l'opérateur de multiplication fonctionne mais pas l'opérateur de soustraction.

b = "the"
a = b * 5
print a
a -= (b * 2)  
print a

Production

the 
the the the the the 
Traceback (most recent call last):
    a -=  (b * 2)
TypeError: unsupported operand type(s) for -=: 'str' and 'str'

Comment puis-je réduire le nombre de "the" dans un par 2. Si cela ne peut pas être fait ainsi, y a-t-il une méthode plus simple pour le faire?

1
Jyxton Plu 17 nov. 2011 à 17:51

6 réponses

Meilleure réponse

Pour réduire le nombre de "the" de 2 dans votre mot, essayez avec le remplacer:

b = "the"
a = b * 5
print a
>>> "thethethethethe"
a = a.replace(b, "", 2)  # or a.replace(b*2, "", 1) if you want to remove "thethe" from the string
print a
>>> "thethethe"

Si vous souhaitez supprimer le "the" en commençant par la fin, utilisez rsplit ()

b = "the"
a = "theAtheBthethe"
a = "".join(a.rsplit("the", 2))   # or "".join(a.rsplit("thethe", 1)) if you want to remove "theth" of the string
print a
>>> "theAtheB"

Comme décrit ici, l'opérateur * est pris en charge par la chaîne (et les types unicode, list, tuple, bytearray, buffer, xrange), b * 5 renvoie 5 copies de b concaténées.

3
Cédric Julien 17 nov. 2011 à 14:23

Il n'y a pas de support pour l'opérateur de soustraction en cas de chaînes, mais vous pouvez simplement en ajouter un:

>>> class MyStr(str):
    def __init__(self, val):
        return str.__init__(self, val)
    def __sub__(self, other):
        if self.count(other) > 0:
            return self.replace(other, '', 1)
        else:
            return self

Et cela fonctionnera de la manière suivante:

>>> a = MyStr('thethethethethe')
>>> b = a - 'the'
>>> a
'thethethethethe'
>>> b
'thethethethe'
>>> b = a - 2 * 'the'
>>> b
'thethethe'

En ce qui concerne l'opération a - 2 * 'the', vous devez savoir que ce n'est pas " supprimer deux fois 'la' chaîne d'un ", mais " supprimer le résultat de (2 fois 'le') d'un "(multipliez d'abord" the "par 2 puis soustrayez de a).

C'est bien ce que vous attendiez?

2
Tadeck 17 nov. 2011 à 14:11
a = a.rpartition(b * 2)[0]

Devrait le faire, en coupant du côté droit. Si vous n'avez aucun exemple de 'thethe' dans a, il renverra la chaîne vide ''. Cela ne fonctionnera pas si vous avez plusieurs 'the' séparés par d'autres caractères. Pour cela, vous pouvez utiliser a.rpartition(b)[0] deux fois. Si vous souhaitez couper à partir de la gauche, utilisez a.partition(b * 2)[2].

Pourquoi la soustraction ne fonctionne-t-elle pas? L'utilisation de l'addition et de la multiplication est une fonctionnalité pratique pour travailler avec des chaînes. La sémantique de soustraction (ou de division) str s n'est pas définie pour Python, vous ne pouvez donc pas l'utiliser de cette façon.

1
Michael Hoffman 17 nov. 2011 à 13:58

Cela dépend si vous voulez les couper au début ou à la fin, vous pouvez utiliser des sous-ensembles de tableaux:

>>> a[2*len("the"):]
'thethethe'
>>> a[:-(2*len("the"))]
'thethethe'
2
Spacedman 17 nov. 2011 à 13:56
b = "the"
a = b * 5
print a

a = a[:-2*len(b)]
print a

# returns: thethethe

Je ne soustrait pas (vous ne pouvez pas vraiment le faire avec des chaînes), je supprime deux fois la longueur de b à la fin de a, en ignorant sa valeur réelle.

3
eumiro 17 nov. 2011 à 13:55

L'opérateur Plus fonctionne parce que "+" concatène alors que moins n'opère pas sur les chaînes. Vous pouvez essayer quelque chose en utilisant une expression régulière, comme:

import re

s="the"*5
expr="the"

print s

# s -= 2
print "".join(re.findall(expr,s)[:-2])

# s -=3
print "".join(re.findall(expr,s)[:-3])
1
Tiago Maluta 17 nov. 2011 à 17:44