Bagaimana cara menghapus nol di depan dan di belakang dalam sebuah string? Python

110

Saya memiliki beberapa string alfanumerik seperti ini

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

Output yang diinginkan untuk menghapus nol tertinggal adalah:

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

Output yang diinginkan untuk awalan nol di belakangnya adalah:

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

Output keinginan untuk menghapus nol di depan dan di belakang adalah:

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

Untuk saat ini saya sudah melakukannya dengan cara berikut, mohon saran cara yang lebih baik jika ada:

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)
alva
sumber

Jawaban:

238

Bagaimana dengan dasar

your_string.strip("0")

menghapus nol di belakang dan di depan? Jika Anda hanya tertarik untuk menghapus nol di belakang, gunakan .rstripsebagai gantinya (dan .lstriphanya untuk yang di depan).

[Info selengkapnya di dokumen .]

Anda bisa menggunakan beberapa pemahaman daftar untuk mendapatkan urutan yang Anda inginkan seperti:

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]
Pierre GM
sumber
2
Apakah ada penyesuaian cerdas untuk jawaban ini untuk kasus khusus s = '0'?
Charles
7
@Charles: Ya! Saya baru saja mengalami masalah yang sama, dan Anda dapat melakukannya s.strip("0") or "0": jika string Anda berubah menjadi string kosong, itu akan dievaluasi sebagai Falseoleh atau dan akan diganti dengan string yang diinginkan"0"
tarulen
@Pierre GM Terima kasih. Ini sangat membantu dan sangat sederhana. Suara positif
Vishav Gupta
18

Hapus di depan + di belakang '0':

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

Hapus awalan '0':

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

Hapus tanda '0':

list = [ i.rstrip('0') for i in listOfNum ]
fho
sumber
Terima kasih atas jawaban anda. Ini sangat membantu. Saya telah
memilihnya
7

Anda cukup melakukan ini dengan bool:

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

   number = int(number)

else:

   number = float(number)
Bjarne
sumber
2
Tidak berfungsi alphanumeric0000seperti yang diminta OP.
Karl Richter
4

Apakah Anda mencoba dengan strip () :

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

>>> ['231512-n', '1209123100000-n', 'alphanumeric', 'alphanumeric']
Cédric Julien
sumber
1

str.stripadalah pendekatan terbaik untuk situasi ini, tetapi more_itertools.stripjuga merupakan solusi umum yang menghapus elemen awal dan akhir dari iterable:

Kode

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

Detail

Perhatikan, di sini kita menghapus leading dan trailing "0"s di antara elemen lain yang memenuhi predikat. Alat ini tidak terbatas pada string.

Lihat juga dokumen untuk lebih banyak contoh

more_itertoolsadalah pustaka pihak ketiga yang dapat dipasang melalui > pip install more_itertools.

pylang
sumber
1

Dengan asumsi Anda memiliki tipe data lain (dan tidak hanya string) dalam daftar Anda, coba ini. Ini menghapus nol di belakang dan di depan dari string dan membiarkan tipe data lain tidak tersentuh. Ini juga menangani kasus khusus s = '0'

misalnya

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

escha
sumber