2010-10-26 4 views
34

Je suis novice en Python face à un problème: Comment insérer des champs dans une chaîne déjà existante?Insérer une chaîne dans une chaîne donnée à un index donné en Python

Par exemple, supposons que j'ai lu une ligne de tout fichier qui contient:

line = "Name Age Group Class Profession" 

Maintenant, je dois ajouter 3rd Field (Group) 3 fois plus dans la même ligne avant champ Classe. Cela signifie que la ligne de sortie doit être:

output_line = "Name Age Group Group Group Group Class Profession" 

je peux récupérer 3ème champ facilement (en utilisant la méthode split), mais s'il vous plaît laissez-moi savoir la meilleure façon d'insérer dans la chaîne?

Répondre

6
line='Name Age Group Class Profession' 
arr = line.split() 
for i in range(3): 
    arr.insert(2, arr[2]) 
print(' '.join(arr)) 
2

Il y a plusieurs façons de le faire:

Une façon est d'utiliser le découpage:

>>> a="line=Name Age Group Class Profession" 
>>> b=a.split() 
>>> b[2:2]=[b[2]]*3 
>>> b 
['line=Name', 'Age', 'Group', 'Group', 'Group', 'Group', 'Class', 'Profession'] 
>>> a=" ".join(b) 
>>> a 
'line=Name Age Group Group Group Group Class Profession' 

Une autre solution serait d'utiliser des expressions régulières:

>>> import re 
>>> a=re.sub(r"(\S+\s+\S+\s+)(\S+\s+)(.*)", r"\1\2\2\2\2\3", a) 
>>> a 
'line=Name Age Group Group Group Group Class Profession' 
85

Un important point qui mord souvent les nouveaux programmeurs Python, mais les autres affiches ne sont pas explicites est que les chaînes en Python sont immutab le - vous ne pouvez pas jamais les les modifier en place.

Vous avez besoin de vous recycler lorsque vous travaillez avec des chaînes en Python afin que, au lieu de penser, "Comment puis-je modifier cette chaîne?" Au lieu de cela, vous pensez "comment puis-je créer une nouvelle chaîne avec des morceaux de celle que j'ai déjà obtenue?"

+10

Ceci n'excuse pas vraiment Python de ne pas avoir d'insert indexé ou de remplacer!La sortie pourrait simplement être une nouvelle chaîne qui contient le résultat souhaité. –

+4

@CodieCodeMonkey le Python Zen mentionne que 'Explicit est meilleur qu'implicite'. Vous voulez que le développeur sache qu'il travaillera sur une copie. Sinon, il rencontrera très certainement des problèmes avec l'identité de l'objet, ce qui sera frustrant pour le débogage. Chaîne de pensée - penser fonctionnel. – Zakum

+6

@Zakum, je comprends ce que vous voulez dire, mais il existe des précédents, par exemple. str.strip(). Un développeur qui n'a pas lu attentivement la documentation peut penser que strip() fonctionne sur l'original. –

58

Pour les futurs «débutants» s'attaquant à ce problème, je pense qu'une réponse rapide serait adaptée à ce sujet.

Comme bgporter dit: Les chaînes Python sont immuables, et donc, pour modifier une chaîne, vous devez utiliser les pièces que vous avez déjà.

Dans l'exemple suivant insérer 'Fu' pour 'Kong Panda', pour créer 'Kong Fu Panda'

>>> line = 'Kong Panda' 
>>> index = line.find('Panda') 
>>> output_line = line[:index] + 'Fu ' + line[index:] 
>>> output_line 
'Kong Fu Panda' 

Dans l'exemple ci-dessus, je la valeur d'index de « tranche » la chaîne en 2 sous-chaînes: 1 contenant le sous-chaîne avant l'index d'insertion, et l'autre contenant le reste. Ensuite, il suffit d'ajouter la chaîne désirée entre les deux et voilà, nous avons inséré une chaîne à l'intérieur d'un autre.

Python's slice notation a une excellente réponse expliquant le sujet du tranchage de la chaîne.

+3

Grande réponse, mais je crois que le titre du film est orthographié "* Kung * Fu Panda" –

6

Je sais qu'il est malapropos, mais à mon humble avis manière simple est la suivante:

def insert (source_str, insert_str, pos): 
    return source_str[:pos]+insert_str+source_str[pos:] 
0

J'ai eu un problème similaire pour ma mission d'ADN et moi les conseils de bgporter pour y répondre. Voici ma fonction qui crée une nouvelle chaîne ...

def insert_sequence(str1, str2, int): 
    """ (str1, str2, int) -> str 

    Return the DNA sequence obtained by inserting the 
    second DNA sequence into the first DNA sequence 
    at the given index. 

    >>> insert_sequence('CCGG', 'AT', 2) 
    CCATGG 
    >>> insert_sequence('CCGG', 'AT', 3) 
    CCGATG 
    >>> insert_sequence('CCGG', 'AT', 4) 
    CCGGAT 
    >>> insert_sequence('CCGG', 'AT', 0) 
    ATCCGG 
    >>> insert_sequence('CCGGAATTGG', 'AT', 6) 
    CCGGAAATTTGG 

    """ 

    str1_split1 = str1[:int] 
    str1_split2 = str1[int:] 
    new_string = str1_split1 + str2 + str1_split2 
    return new_string 
Questions connexes