J'ai fait ce code mais la sortie n'est pas comme ce que je veux

def replace(s,p,n):
    return "".join("{}".format(p) if not i % n else char for i, char in enumerate(s,1))

print(replace("university","-",3))

La sortie que j'obtiens est un-ve-si-y

Je dois le faire comme: uni-ver-sit-y

0
Encode.to.code 23 mai 2018 à 10:58

4 réponses

Meilleure réponse

Ceci est une approche. en utilisant le str découpage.

Démo:

def replace(s,p,n):
    return p.join([s[i:i+n] for i in range(0, len(s), n)])

print(replace("university","-",3))

Sortie:

uni-ver-sit-y
4
akash karothiya 23 mai 2018 à 08:20

Alternativement, vous pouvez le faire fonctionnellement comme ceci:

from itertools import repeat


def take(s, n):
    """"take n characters from s"""
    return s[:n]

def skip(s, n):
    """"skip n characters from s"""
    return s[n:]

def replace(s, p, n):

    # create intervals at which to prefix
    intervals = range(0, len(s), n)

    # create the prefix for all chunks
    prefix = map(skip, repeat(s), intervals)

    # trim prefix for n characters each
    chunks = map(take, prefix, repeat(n))

    return p.join(chunks)

Et maintenant:

replace('university', '-', 3)

Te donnera:

'uni-ver-sit-y'

Remarque: ceci est un exemple de code, si cela est censé être efficace, vous devriez probablement utiliser des fonctions évaluées paresseuses (comme islice) qui peuvent prendre beaucoup moins de mémoire pour des entrées plus importantes.

0
Reut Sharabani 23 mai 2018 à 08:20

Si vous étendez le code sur plusieurs lignes:

chars_to_join = []
for i, char in enumerate(s,1):
    if not i % n:
        chars_to_join.append("{}".format(p))
    else:
        chars_to_join.append(char)

Vous verrez que lorsque l'instruction if est vraie, elle remplacera simplement le caractère plutôt que d'inclure le caractère de remplacement après le caractère donné, modifiez donc simplement la chaîne de format pour inclure également le caractère actuellement itéré

"{}{}".format(char, p)
1
Sayse 23 mai 2018 à 08:06

Pour cette question, je pense que la liste-compréhension n'est pas une très bonne idée. Ce n'est pas clairement compris. Peut-être pouvons-nous le rendre plus clair en suivant:

def replace(s,p,n):
    new_list = []
    for i, c in enumerate(s, 1):
        new_list.append(c)
        if i % n == 0:
            new_list.append(p)

    return "".join(new_list)


print(replace("university","-",3))
0
Reut Sharabani 23 mai 2018 à 08:28