ลบบรรทัดต่อท้ายจากองค์ประกอบของรายการสตริง


123

ฉันต้องใช้รายการคำจำนวนมากในรูปแบบ:

['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']

จากนั้นใช้ฟังก์ชันสตริปเปลี่ยนเป็น:

['this', 'is', 'a', 'list', 'of', 'words']

ฉันคิดว่าสิ่งที่ฉันเขียนจะได้ผล แต่ฉันได้รับข้อผิดพลาดอยู่เสมอว่า:

"วัตถุ" รายการ "ไม่มีแอตทริบิวต์" strip ""

นี่คือรหัสที่ฉันลอง:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())

1
โปรดอธิบายว่าเหตุใดคุณจึงต่อท้าย 0 ถึงstrip_list19 ครั้งแล้วต่อท้ายบรรทัดที่ถูกขีดฆ่า รหัสนั้นมีกลิ่นเหม็นมากเกี่ยวกับเรื่องนี้ นอกจากนี้หากคุณได้รับสิ่งนั้นจากไฟล์คุณควรจะลอกมันออกระหว่างทาง - การสร้างรายการขนาดใหญ่จากนั้นทุบตีเป็นรายการขนาดใหญ่อื่นไม่ใช่ความคิดที่ดี นอกจากนี้ 2 รหัสของคุณไม่ควรขึ้นอยู่กับการรู้ความยาวของคำ / บรรทัดที่ยาวที่สุด ย้อนกลับไปอีกนิด - คุณพยายามทำอะไรให้สำเร็จ? คุณจะทำอะไรกับstrip_list?
John Machin

คำตอบ:


212
>>> my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> map(str.strip, my_list)
['this', 'is', 'a', 'list', 'of', 'words']

ฉันสามารถพูดว่า stripped_list = map (str.strip, my_list) แล้วพิมพ์ stripped_list เพื่อพิมพ์รายการใหม่นี้ได้ไหม
George Burrows

19
หากคุณใช้ Python 2 โปรดทราบว่าstr.stripจะใช้ได้เฉพาะเมื่อคุณแน่ใจว่ารายการไม่มีสตริง Unicode หากสามารถมีทั้งสตริง 8 บิตและ Unicode ให้ใช้lambda s: s.strip()ตามที่กล่าวไว้ข้างต้นหรือใช้stripฟังก์ชันที่คุณสามารถนำเข้าจากstringsโมดูลได้
Cito

ความคิดเห็นของ Cito เป็นความคิดเห็นที่สมควรได้รับการตอบกลับมากที่สุด แผนที่และรายการความเข้าใจไม่เทียบเท่าใน OOP เนื่องจากเราเป็นวิธีการแบบพาสไม่ใช่ฟังก์ชัน
e-satis

สร้างขึ้นในฟังก์ชั่นแผนที่ใน
Samaritan

39
จะตระหนักถึงต่อไปนี้: ถ้าคุณกำลังใช้งูหลาม 3.x และคุณต้องการที่จะกลับรายการคุณต้องเพื่อให้มันเป็นlist list(map(str.strip, my_list))ยังตรวจสอบว่าเชื่อมโยง
.


65

คุณสามารถใช้รายการเพื่อความเข้าใจ :

strip_list = [item.strip() for item in lines]

หรือmapฟังก์ชั่น:

# with a lambda
strip_list = map(lambda it: it.strip(), lines)

# without a lambda
strip_list = map(str.strip, lines)

3
แลมบ์ดาในเวอร์ชันที่สองนั้นใช้งานมากเกินไป
gddc

1
คุณสามารถใช้วิธีเดียวกันนี้เพื่อทำอะไรก็ได้โดยให้0ค่าที่อยู่ตอนต้นของรายการได้เช่นกัน แม้ว่าฉันจะนึกไม่ออกจริงๆว่าคุณกำลังพยายามทำอะไรอยู่โดยใส่ไว้ในรายการผลลัพธ์เดียวกัน ...
Karl Knechtel

4
ใน Python 3 รูปแบบที่ 3 "ไม่มีแลมบ์ดา" ควรเป็นstrip_list = list(map(str.strip, lines))ตามแผนที่ () ส่งคืนตัวทำซ้ำแผนที่ docs.python.org/3/library/functions.html#map
Devy

7

สามารถทำได้โดยใช้การทำความเข้าใจรายการตามที่กำหนดไว้ในPEP 202

[w.strip() for w in  ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']]

ฉันกำลังคิดจะเปลี่ยนชื่อจากlistเป็นmap:)
Casey

3

คำตอบอื่น ๆ ทั้งหมดและส่วนใหญ่เกี่ยวกับความเข้าใจในรายการนั้นยอดเยี่ยมมาก แต่เพื่ออธิบายข้อผิดพลาดของคุณ:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())

aเป็นสมาชิกของรายการของคุณไม่ใช่ดัชนี สิ่งที่คุณสามารถเขียนได้คือ:

[...]
for a in lines:
    strip_list.append(a.strip())

ความคิดเห็นที่สำคัญอีกประการ: คุณสามารถสร้างรายการว่างด้วยวิธีนี้:

strip_list = [0] * 20

แต่สิ่งนี้ไม่มีประโยชน์มากนักเนื่องจากต่อ.append ท้ายรายการของคุณ ในกรณีของคุณการสร้างรายการที่มีค่า defaut ไม่มีประโยชน์เนื่องจากคุณจะสร้างรายการต่อรายการเมื่อต่อท้ายสตริงที่ถูกขีดฆ่า

ดังนั้นรหัสของคุณควรเป็นดังนี้:

strip_list = []
for a in lines:
    strip_list.append(a.strip())

แต่แน่นอนว่าสิ่งที่ดีที่สุดคืออันนี้เพราะนี่คือสิ่งเดียวกัน:

stripped = [line.strip() for line in lines]

ในกรณีที่คุณมีบางสิ่งที่ซับซ้อนกว่าเพียงแค่.stripใส่สิ่งนี้ในฟังก์ชันแล้วทำเช่นเดียวกัน นั่นเป็นวิธีที่อ่านง่ายที่สุดในการทำงานกับรายการ


2

หากคุณต้องการลบช่องว่างต่อท้ายออกคุณสามารถใช้ได้str.rstrip()ซึ่งน่าจะมีประสิทธิภาพมากกว่าstr.strip():

>>> lst = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> [x.rstrip() for x in lst]
['this', 'is', 'a', 'list', 'of', 'words']
>>> list(map(str.rstrip, lst))
['this', 'is', 'a', 'list', 'of', 'words']

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