Làm cách nào để loại bỏ các chuỗi con cụ thể khỏi một chuỗi các chuỗi trong Python?


160

Tôi có một bộ chuỗi set1và tất cả các chuỗi set1có hai chuỗi con cụ thể mà tôi không cần và muốn loại bỏ.
Đầu vào mẫu: set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
Vì vậy, về cơ bản tôi muốn loại bỏ .goodvà các .badchuỗi con khỏi tất cả các chuỗi.
Những gì tôi đã cố gắng:

for x in set1:
    x.replace('.good','')
    x.replace('.bad','')

Nhưng điều này dường như không hoạt động. Hoàn toàn không có thay đổi trong đầu ra và nó cũng giống như đầu vào. Tôi đã thử sử dụng for x in list(set1)thay vì bản gốc nhưng điều đó không thay đổi gì cả.

Câu trả lời:


186

Dây là bất biến. string.replace(python 2.x) hoặc str.replace(python 3.x) tạo ra một chuỗi mới . Điều này được nêu trong tài liệu:

Trả về một bản sao của chuỗi s với tất cả các lần xuất hiện của chuỗi con cũ được thay thế bằng mới. ...

Điều này có nghĩa là bạn phải phân bổ lại tập hợp hoặc điền lại nó (phân bổ lại dễ dàng hơn với việc hiểu tập hợp) :

new_set = {x.replace('.good', '').replace('.bad', '') for x in set1}

3
string.replace()không dùng nữa trên python 3.x, bây giờ làstr.replace()
Yossarian42

71
>>> x = 'Pear.good'
>>> y = x.replace('.good','')
>>> y
'Pear'
>>> x
'Pear.good'

.replacekhông thay đổi chuỗi, nó trả về một bản sao của chuỗi với sự thay thế. Bạn không thể thay đổi chuỗi trực tiếp vì chuỗi là bất biến.

Bạn cần lấy các giá trị trả về từ x.replacevà đặt chúng vào một bộ mới.


Nhưng khi tôi lặp qua bộ chuỗi, làm thế nào tôi có thể cập nhật một bộ mới? sử dụng set_name.update? Bạn có thể cho thấy điều đó?
controlfreak

12

Tất cả bạn cần là một chút ma thuật đen!

>>> a = ["cherry.bad","pear.good", "apple.good"]
>>> a = list(map(lambda x: x.replace('.good','').replace('.bad',''),a))
>>> a
['cherry', 'pear', 'apple']

5

Bạn có thể làm điều này:

import re
import string
set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}

for x in set1:
    x.replace('.good',' ')
    x.replace('.bad',' ')
    x = re.sub('\.good$', '', x)
    x = re.sub('\.bad$', '', x)
    print(x)

2
dòng x.replace('.good',' ')x.replace('.bad',' ')không làm bất cứ điều gì để kết quả cuối cùng. Bản in ra sẽ giống nhau mà không có chúng.
Srđan Popić

Ngoài ra, tôi chỉ muốn có một dòng với re.sub, như thế này:x = re.sub('((\.good$)|(\.bad$))', '', x)
Srđan Popić

@ SrđanPopić vâng tôi đồng ý với bạn
Vivek

chúng ta nên chỉnh sửa nó cho phù hợp? (xóa replaces và chuyển mọi thứ thành một re.subcuộc gọi)
Srđan Popić

1
@ SrđanPopić Tôi đăng câu trả lời này vì nó đơn giản và bước khôn ngoan.
Vivek

3

Tôi đã làm bài kiểm tra (nhưng đó không phải là ví dụ của bạn) và dữ liệu không trả lại chúng theo thứ tự hoặc hoàn thành

>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> newind = {x.replace('p','') for x in ind}
>>> newind
{'1', '2', '8', '5', '4'}

Tôi đã chứng minh rằng điều này hoạt động:

>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> newind = [x.replace('p','') for x in ind]
>>> newind
['5', '1', '8', '4', '2', '8']

hoặc là

>>> newind = []
>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> for x in ind:
...     newind.append(x.replace('p',''))
>>> newind
['5', '1', '8', '4', '2', '8']

3

Khi có nhiều lớp nền cần loại bỏ, một tùy chọn đơn giản và hiệu quả là sử dụng re.subvới một mẫu được biên dịch có liên quan đến việc nối tất cả các chuỗi con để loại bỏ bằng cách sử dụng ống regex OR ( |).

import re

to_remove = ['.good', '.bad']
strings = ['Apple.good','Orange.good','Pear.bad']

p = re.compile('|'.join(map(re.escape, to_remove))) # escape to handle metachars
[p.sub('', s) for s in strings]
# ['Apple', 'Orange', 'Pear']

1

Nếu danh sách

Tôi đã làm một cái gì đó cho một danh sách là một chuỗi các chuỗi và bạn muốn xóa tất cả các dòng có một chuỗi con nhất định, bạn có thể làm điều này

import re
def RemoveInList(sub,LinSplitUnOr):
    indices = [i for i, x in enumerate(LinSplitUnOr) if re.search(sub, x)]
    A = [i for j, i in enumerate(LinSplitUnOr) if j not in indices]
    return A

một nơi submà bạn không muốn có trong một danh sách các dòngLinSplitUnOr

ví dụ

A=['Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad']
sub = 'good'
A=RemoveInList(sub,A)

Rồi Asẽ

nhập mô tả hình ảnh ở đây


0

nếu bạn xóa một cái gì đó khỏi danh sách, bạn có thể sử dụng cách này: (phương thức phụ là phân biệt chữ hoa chữ thường)

new_list = []
old_list= ["ABCDEFG","HKLMNOP","QRSTUV"]

for data in old_list:
     new_list.append(re.sub("AB|M|TV", " ", data))

print(new_list) // output : [' CDEFG', 'HKL NOP', 'QRSTUV']
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.