Làm cách nào để loại bỏ các số không ở đầu và cuối trong một chuỗi? Python


110

Tôi có một số chuỗi chữ và số như thế này

listOfNum = ['000231512-n','1209123100000-n00000','alphanumeric0000', '000alphanumeric']

Đầu ra mong muốn để loại bỏ các số không ở cuối sẽ là:

listOfNum = ['000231512-n','1209123100000-n','alphanumeric', '000alphanumeric']

Đầu ra mong muốn cho các số không ở cuối hàng đầu sẽ là:

listOfNum = ['231512-n','1209123100000-n00000','alphanumeric0000', 'alphanumeric']

Đầu ra mong muốn để loại bỏ cả số không ở đầu và ở cuối sẽ là:

listOfNum = ['231512-n','1209123100000-n', 'alphanumeric', 'alphanumeric']

Hiện tại, tôi đã làm theo cách sau, vui lòng đề xuất một cách tốt hơn nếu có:

listOfNum = ['000231512-n','1209123100000-n00000','alphanumeric0000', \
'000alphanumeric']
trailingremoved = []
leadingremoved = []
bothremoved = []

# Remove trailing
for i in listOfNum:
  while i[-1] == "0":
    i = i[:-1]
  trailingremoved.append(i)

# Remove leading
for i in listOfNum:
  while i[0] == "0":
    i = i[1:]
  leadingremoved.append(i)

# Remove both
for i in listOfNum:
  while i[0] == "0":
    i = i[1:]
  while i[-1] == "0":
    i = i[:-1]
  bothremoved.append(i)

Câu trả lời:


238

Về cơ bản thì sao

your_string.strip("0")

để loại bỏ cả số không ở cuối và ở đầu? Nếu bạn chỉ quan tâm đến việc loại bỏ các số không ở cuối, hãy sử dụng .rstripthay thế (và .lstripchỉ những số ở đầu).

[Thông tin thêm trong tài liệu .]

Bạn có thể sử dụng một số hiểu danh sách để có được các trình tự bạn muốn như vậy:

trailing_removed = [s.rstrip("0") for s in listOfNum]
leading_removed = [s.lstrip("0") for s in listOfNum]
both_removed = [s.strip("0") for s in listOfNum]

2
Có bất kỳ điều chỉnh thông minh nào cho câu trả lời này cho trường hợp đặc biệt của s = '0'?
— Charles

7
@Charles: Có! Tôi chỉ có cùng một vấn đề, và bạn có thể làm s.strip("0") or "0": nếu chuỗi lượt của bạn vào chuỗi rỗng, nó sẽ đánh giá như Falsebằng hay và sẽ được thay thế bằng chuỗi mong muốn"0"
— tarulen

@Pierre GM Cảm ơn bạn. Nó thực sự hữu ích và nó rất đơn giản. Đã ủng hộ nó
— Vishav Gupta

18

Xóa đầu + cuối '0':

list = [i.strip('0') for i in listOfNum ]

Xóa '0' ở đầu:

list = [ i.lstrip('0') for i in listOfNum ]

Loại bỏ dấu '0':

list = [ i.rstrip('0') for i in listOfNum ]

cảm ơn câu trả lời của bạn. Nó thực sự hữu ích. Tôi đã
— ủng hộ

7

Bạn chỉ có thể làm điều này với bool:

if int(number) == float(number):

   number = int(number)

else:

   number = float(number)

2
Không hoạt động với alphanumeric0000như OP yêu cầu.
— Karl Richter

4

Bạn đã thử với dải () :

listOfNum = ['231512-n','1209123100000-n00000','alphanumeric0000', 'alphanumeric']
print [item.strip('0') for item in listOfNum]

>>> ['231512-n', '1209123100000-n', 'alphanumeric', 'alphanumeric']

1

str.striplà cách tiếp cận tốt nhất cho tình huống này, nhưng more_itertools.stripcũng là một giải pháp chung loại bỏ cả phần tử đầu và phần tử cuối khỏi một phần tử có thể lặp lại:

Mã

import more_itertools as mit


iterables = ["231512-n\n","  12091231000-n00000","alphanum0000", "00alphanum"]
pred = lambda x: x in {"0", "\n", " "}
list("".join(mit.strip(i, pred)) for i in iterables)
# ['231512-n', '12091231000-n', 'alphanum', 'alphanum']

Chi tiết

Lưu ý, ở đây chúng tôi loại bỏ cả hai đầu và cuối "0"giữa các phần tử khác thỏa mãn một vị từ. Công cụ này không giới hạn ở các chuỗi.

Xem thêm tài liệu để biết thêm ví dụ về

more_itertoolslà thư viện của bên thứ ba có thể cài đặt qua > pip install more_itertools.


1

Giả sử bạn có các kiểu dữ liệu khác (và không chỉ chuỗi) trong danh sách của bạn, hãy thử điều này. Thao tác này loại bỏ các số không ở cuối và ở đầu khỏi các chuỗi và để nguyên các kiểu dữ liệu khác. Điều này cũng xử lý trường hợp đặc biệt s = '0'

ví dụ

a = ['001', '200', 'akdl00', 200, 100, '0']

b = [(lambda x: x.strip('0') if isinstance(x,str) and len(x) != 1 else x)(x) for x in a]

b
>>>['1', '2', 'akdl', 200, 100, '0']
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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.