จะลบเลขศูนย์นำหน้าและหลังในสตริงได้อย่างไร? Python


112

ฉันมีสตริงตัวอักษรและตัวเลขหลายตัวเช่นนี้

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

ผลลัพธ์ที่ต้องการสำหรับการลบเลขศูนย์ต่อท้ายจะเป็น:

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

ผลลัพธ์ที่ต้องการสำหรับเลขศูนย์นำหน้าจะเป็น:

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

ผลลัพธ์ที่ต้องการสำหรับการลบทั้งเลขศูนย์นำหน้าและต่อท้ายจะเป็น:

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

ตอนนี้ฉันได้ทำวิธีต่อไปนี้แล้วโปรดแนะนำวิธีที่ดีกว่าหากมี:

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)

คำตอบ:


240

สิ่งที่เกี่ยวกับพื้นฐาน

your_string.strip("0")

เพื่อลบทั้งเลขท้ายและเลขศูนย์นำหน้า? หากคุณสนใจเฉพาะการลบเลขศูนย์ต่อท้ายให้ใช้.rstripแทน (และ.lstripเฉพาะเลขนำหน้าเท่านั้น)

[ข้อมูลเพิ่มเติมในเอกสาร ]

คุณสามารถใช้ความเข้าใจในรายการเพื่อให้ได้ลำดับที่คุณต้องการดังนี้:

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
มีการปรับเปลี่ยนที่ชาญฉลาดสำหรับคำตอบนี้สำหรับกรณีพิเศษs = '0'หรือไม่?
Charles

8
@ ชาร์ลส์: ใช่! ฉันเพิ่งมีปัญหาเดียวกันและคุณสามารถทำได้s.strip("0") or "0": ถ้าสตริงของคุณเปลี่ยนเป็นสตริงว่างมันจะประเมินFalseตามหรือและจะถูกแทนที่ด้วยสตริงที่ต้องการ"0"
tarulen

@Pierre GM ขอบคุณครับ มันช่วยได้มากและง่ายมาก upvoted มัน
Vishav Gupta

18

ลบนำหน้า + ต่อท้าย '0':

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

ลบ "0" ที่นำหน้า:

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

ลบต่อท้าย '0':

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

ขอบคุณสำหรับคำตอบ. มันช่วยได้จริงๆ ฉันโหวตให้แล้ว
Vishav Gupta

7

คุณสามารถทำได้ด้วยบูล:

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

   number = int(number)

else:

   number = float(number)

2
ใช้ไม่ได้alphanumeric0000ตามที่ OP ร้องขอ
Karl Richter

4

คุณลองใช้แถบ () :

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

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

1

str.stripเป็นแนวทางที่ดีที่สุดสำหรับสถานการณ์นี้ แต่more_itertools.stripยังเป็นวิธีแก้ปัญหาทั่วไปที่ดึงองค์ประกอบทั้งนำหน้าและต่อท้ายจากการทำซ้ำ:

รหัส

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

รายละเอียด

สังเกตว่าที่นี่เราดึงทั้งส่วนนำและส่วนท้ายออก"0"จากองค์ประกอบอื่น ๆ ที่ตรงตามเพรดิเคต เครื่องมือนี้ไม่ จำกัด เฉพาะสตริง

ดูเอกสารสำหรับตัวอย่างเพิ่มเติมของ

more_itertoolsเป็นไลบรารีของบุคคลที่สามที่สามารถติดตั้งได้ผ่านทาง> pip install more_itertools.


1

สมมติว่าคุณมีประเภทข้อมูลอื่น (และไม่ใช่เฉพาะสตริง) ในรายการของคุณให้ลองทำเช่นนี้ ซึ่งจะลบเลขศูนย์ต่อท้ายและนำหน้าออกจากสตริงและปล่อยให้ประเภทข้อมูลอื่น ๆ ไม่ถูกแตะต้อง นอกจากนี้ยังจัดการกรณีพิเศษ s = '0'

เช่น

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.