2010-10-26 65 views
34

Tôi là newbie trong Python đối mặt với một vấn đề: Làm thế nào để chèn một số trường trong chuỗi đã tồn tại?Chèn một số chuỗi vào chuỗi đã cho tại chỉ mục đã cho trong Python

Ví dụ, giả sử tôi đã đọc một dòng từ bất kỳ tập tin nào chứa:

line = "Name Age Group Class Profession" 

Bây giờ tôi phải chèn 3rd Field (Group) hơn 3 lần trong cùng một dòng trước khi lĩnh vực Class. Nó có nghĩa là dòng sản lượng nên là:

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

tôi có thể lấy lĩnh vực thứ 3 một cách dễ dàng (sử dụng split phương pháp), nhưng xin vui lòng cho tôi biết cách dễ nhất để chèn vào chuỗi?

Trả lời

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

Có một số cách để làm điều này:

Một cách là sử dụng cắt:

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

khác sẽ được sử dụng biểu thức thông thường:

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

Một quan trọng điểm thường cắn các lập trình viên Python mới nhưng các áp phích khác không làm rõ ràng là các chuỗi trong Python là bất biến le - bạn không thể bao giờ sửa đổi chúng tại chỗ.

Bạn cần phải đào tạo lại bản thân khi làm việc với các chuỗi bằng Python để thay vì nghĩ, "Làm thế nào tôi có thể sửa đổi chuỗi này?" thay vào đó bạn đang nghĩ "làm thế nào tôi có thể tạo ra một chuỗi mới có một số phần từ cái này mà tôi đã nhận được?"

+10

Điều này không thực sự lý do Python không có chèn hoặc thay thế được lập chỉ mục!Đầu ra chỉ có thể là một chuỗi mới chứa kết quả mong muốn. –

+4

@CodieCodeMonkey the Zen Zen đề cập rằng 'Rõ ràng là tốt hơn là ẩn'. Bạn muốn nhà phát triển biết rằng anh ấy sẽ làm việc trên một bản sao. Nếu không, ông chắc chắn nhất sẽ chạy vào các vấn đề với bản sắc đối tượng đó sẽ được bực bội để gỡ lỗi. Suy nghĩ chuỗi - suy nghĩ chức năng. – Zakum

+6

@Zakum, tôi nhận được quan điểm của bạn, nhưng có những tiền lệ cho điều này, ví dụ: str.strip(). Một nhà phát triển không đọc kỹ tài liệu có thể nghĩ rằng strip() hoạt động trên bản gốc. –

58

Vì lợi ích của 'người mới' trong tương lai giải quyết vấn đề này, tôi nghĩ rằng một câu trả lời nhanh sẽ phù hợp với chủ đề này.

Giống như bgporter cho biết: Chuỗi Python không thay đổi được, do đó, để sửa đổi chuỗi, bạn phải tận dụng các phần bạn đã có.

Trong ví dụ sau tôi chèn 'Fu' để 'Kong Panda', để tạo ra 'Kong Fu Panda'

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

Trong ví dụ trên, tôi sử dụng các giá trị chỉ số để 'lát cắt' chuỗi trong 2 chuỗi con: 1 chứa chuỗi con trước chỉ mục chèn và phần còn lại chứa phần còn lại. Sau đó, tôi chỉ cần thêm chuỗi mong muốn giữa hai và voilà, chúng tôi đã chèn một chuỗi bên trong một chuỗi khác.

Python's slice notation có câu trả lời tuyệt vời giải thích chủ đề cắt chuỗi.

+3

Câu trả lời hay, tuy nhiên tôi tin tiêu đề phim được viết là "* Kung * Fu Panda" –

6

Tôi biết đó là không hợp thời, nhưng IMHO cách dễ dàng là:

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

Tôi đã có một vấn đề tương tự để chuyển nhượng DNA của tôi và tôi đã sử dụng lời khuyên bgporter để trả lời nó. Đây là chức năng của tôi, tạo ra một chuỗi mới ...

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 
Các vấn đề liên quan