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:

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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.