2010-10-26 2 views
34

Я новичок в Python, столкнувшись с проблемой: как вставить некоторые поля в уже существующую строку?Вставьте некоторую строку в заданную строку при заданном индексе в Python

Например, предположим, что я прочитал одну строку из любого файла, который содержит:

line = "Name Age Group Class Profession" 

Теперь я должен вставить 3-е поле (Group) в 3 раза больше в той же строке перед полем класса. Это означает, что выходная линия должна быть:

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

я могу получить 3-е поля легко (с помощью split метода), но, пожалуйста, дайте мне знать, самый простой способ вставки в строку?

ответ

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

Есть несколько способов сделать это:

Один из способов заключается в использовании нарезка:

>>> 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' 

Еще бы использовать регулярные выражения:

>>> 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

Важное что часто укусывает новых программистов на Python, но другие плакаты не сделали явным, что строки в Python являются immutab le - вы не можете изменить их на месте.

Вам нужно переподготовку при работе со строками в Python, чтобы вместо того, чтобы думать: «Как я могу изменить эту строку?» вместо этого вы думаете: «Как я могу создать новую строку, в которой есть некоторые части из этой, которую я уже получил?»

+10

Это на самом деле не извиняет Python из-за отсутствия указательной вставки или замены!Вывод может быть просто новой строкой, содержащей требуемый результат. –

+4

@CodieCodeMonkey Python Zen упоминает, что «Явный лучше, чем неявный». Вы хотите, чтобы разработчик знал, что он будет работать над копией. В противном случае он, безусловно, столкнется с проблемами с идентификацией объекта, которые будут разочаровывать отладки. Мышление - думаю, функционально. – Zakum

+6

@ Zakum, я получаю вашу мысль, но есть прецеденты для этого, например. str.strip(). Разработчик, который не внимательно прочитал документацию, может подумать, что strip() работает с оригиналом. –

58

Ради будущих «новичков», решающих эту проблему, я думаю, что быстрый ответ будет подходящим для этой темы.

Как bgporter сказал: строки Python неизменяемы, и поэтому, чтобы изменить строку, вы должны использовать части, которые у вас уже есть.

В следующем примере я вставить 'Fu', чтобы 'Kong Panda', чтобы создать 'Kong Fu Panda'

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

В приведенном выше примере, я использовал значение индекса для «среза» строки в 2 подстрок: 1, содержащий подстрока перед индексом вставки, а другая - остальная. Затем я просто добавляю нужную строку между двумя и voilà, мы вставили строку внутри другой.

Python's slice notation имеет отличный ответ, объясняющий предмет резки струны.

+3

Отличный ответ, однако я считаю, что название фильма написано «* Kung * Fu Panda» –

6

Я знаю, что это некстати, но ИМХО простой способ:

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

У меня была аналогичная проблема для моего назначения ДНК, и я использовал совет bgporter, чтобы ответить на него. Вот моя функция, которая создает новую строку ...

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 
Смежные вопросы