จะพิมพ์รายการได้อย่างไร?


96

ดังนั้นฉันมีรายการ:

['x', 3, 'b']

และฉันต้องการให้ผลลัพธ์เป็น:

[x, 3, b]

ฉันจะทำสิ่งนี้ใน python ได้อย่างไร?

ถ้าฉันทำstr(['x', 3, 'b'])ฉันจะได้รับหนึ่งพร้อมคำพูด แต่ฉันไม่ต้องการคำพูด


เพื่ออธิบายว่าทำไมรายการไม่พิมพ์ "ถูกต้อง" การprint(["Sam"])โทรrepr("Sam")ซึ่งส่งกลับ'Sam'(พร้อมเครื่องหมายคำพูด) ซึ่งแตกต่างจากเมื่อคุณเรียกprint("Sam")และการเรียกpython str("Sam")ซึ่งส่งคืนSam(โดยไม่มีเครื่องหมายอัญประกาศ) ดูความแตกต่างระหว่างstrและreprหรือPython strและlistsสำหรับข้อมูลเพิ่มเติม
ไม่ระบุชื่อ

คำตอบ:


193

ใน Python 2:

mylist = ['x', 3, 'b']
print '[%s]' % ', '.join(map(str, mylist))

ใน Python 3 (ซึ่งprintเป็นฟังก์ชัน builtin และไม่ใช่คุณสมบัติทางไวยากรณ์อีกต่อไป):

mylist = ['x', 3, 'b']
print('[%s]' % ', '.join(map(str, mylist)))

ผลตอบแทนทั้งสอง:

[x, 3, b]

นี้คือการใช้map()ฟังก์ชั่นที่จะเรียก STR สำหรับองค์ประกอบของแต่ละmyliststr.join()สร้างรายการใหม่ของสายที่จะเข้าร่วมแล้วเป็นหนึ่งเดียวกับสตริง จากนั้น%สตริงการจัดรูปแบบดำเนินการแทนสตริงในแทนใน%s"[%s]"


4
ขอบคุณที่ทำงานได้ดี คุณช่วยอธิบายรายละเอียดเล็กน้อยเกี่ยวกับสิ่งที่คุณกำลังทำในบรรทัดที่สองได้หรือไม่? ฉันยังใหม่กับ python
Obaid

19
เขาคือการใช้mapฟังก์ชั่นที่จะเรียกstrองค์ประกอบของแต่ละสร้างรายการใหม่ของสตริงที่แล้วเขาก็เข้าร่วมเป็นหนึ่งกับสตริงmylist str.joinจากนั้นเขาใช้%สตริงการจัดรูปแบบผู้ประกอบการเพื่อทดแทนสตริงในแทนใน%s "[%s]"
li.davidm

6
อีกวิธีในการทำที่อาจจะทันสมัยกว่านี้เล็กน้อย: "[{0}]".format(", ".join(str(i) for i in mylist))
Jack O'Connor

2
ฉันมักจะชอบmap(f, xs)(หรือimapใน python2.x) มากกว่า(f(x) for x in xs)เมื่อfเป็น callable ที่กำหนดไว้ล่วงหน้า ซึ่งมีแนวโน้มที่จะรัน bytecodes น้อยลงและโดยปกติจะมีขนาดกะทัดรัดกว่า แน่นอนว่าไม่ map(lambda x:..., xs)เลวร้ายไปกว่านี้(... for x in xs)
SingleNegationElimination

1
@ user1767754: จริงเหรอ? ลิงค์?
SingleNegationElimination

20

นี่เป็นรหัสง่ายๆดังนั้นหากคุณยังใหม่คุณควรเข้าใจมันได้ง่ายพอ

    mylist = ["x", 3, "b"]
    for items in mylist:
        print(items)

มันพิมพ์ทั้งหมดโดยไม่มีเครื่องหมายคำพูดเหมือนที่คุณต้องการ



14

หากคุณใช้ Python3:

print('[',end='');print(*L, sep=', ', end='');print(']')

1
พิมพ์ (* L) ทำอะไรที่นี่
sandeeps


1
ฉันสับสนกับสิ่งนี้ ประเภทข้อมูลแบบยาวกรองรายการหรือไม่
60

ฉบับที่กระชับกว่านี้จะเป็นprint(end='['); print(*l, sep=', ', end=']\n')
ไม่ระบุชื่อ

9

แทนที่จะใช้mapฉันขอแนะนำให้ใช้นิพจน์ตัวสร้างที่มีความสามารถในjoinการยอมรับตัววนซ้ำ:

def get_nice_string(list_or_iterator):
    return "[" + ", ".join( str(x) for x in list_or_iterator) + "]"

นี่เป็นหน้าที่สมาชิกของชั้นเรียนสตริงjoin strใช้อาร์กิวเมนต์เดียว: รายการ (หรือตัววนซ้ำ) ของสตริงจากนั้นส่งคืนสตริงใหม่ที่มีองค์ประกอบทั้งหมดที่เชื่อมต่อกันในกรณี,นี้


2
การเพิ่มประสิทธิภาพที่ดีสำหรับ Python 2 เนื่องจากแผนที่ส่งคืนรายการใน 2.x มันส่งคืนเครื่องกำเนิดไฟฟ้าใน 3.x ดังนั้นจึงไม่ช่วยได้มากนัก
Tom Zych

7
ฉันจะกลับมา", ".join( str(x) for x in list_or_iterator).join('[]')
eyquem

@eyquem: ฉลาดฉันไม่เคยเห็น join ใช้แบบนั้นมาก่อน ถึงกระนั้นนั่นก็ดูทึบกว่าเล็กน้อยสำหรับผู้เริ่มต้น (เนื่องจากคุณกำลังใช้คุณสมบัติที่สตริงเป็นคอนเทนเนอร์ที่ทำซ้ำได้ของสตริงอักขระเดียว)
Seth Johnson

6

คุณสามารถลบตัวอักษรที่ไม่พึงประสงค์จากการใช้สตริงของtranslate()วิธีการที่มีNoneสำหรับtableการโต้แย้งตามด้วยสตริงที่มีตัวอักษร (s) ที่คุณต้องการลบออกของdeletecharsอาร์กิวเมนต์

lst = ['x', 3, 'b']

print str(lst).translate(None, "'")

# [x, 3, b]

หากคุณใช้ Python เวอร์ชันก่อน 2.6 คุณจะต้องใช้ฟังก์ชันstringของโมดูลtranslate()แทนเนื่องจากความสามารถในการส่งผ่านNoneเนื่องจากtableอาร์กิวเมนต์ไม่ได้ถูกเพิ่มจนกว่า Python 2.6 การใช้งานมีลักษณะดังนี้:

import string

print string.translate(str(lst), None, "'")

การใช้string.translate()ฟังก์ชั่นนี้จะใช้งานได้ใน 2.6+ ดังนั้นการใช้ฟังก์ชันนี้อาจดีกว่า


2
อนิจจา: lst = ["it isn't", 3, 'b']==> ["it isnt", 3, b]และด้วยlst = ['it isn\'t', 3, 'b']
eyquem

1
@eyquem: ใช่การหลีกเลี่ยงการลบอักขระที่เป็นส่วนหนึ่งของข้อมูลของคุณจริง ๆ (แทนที่จะใช้เพื่อคั่นกลางอย่างเคร่งครัด) จะต้องใช้ตรรกะที่ซับซ้อน / แตกต่างกันเล็กน้อยหากเป็นไปได้
martineau

3

นี่คือเซสชันแบบโต้ตอบที่แสดงขั้นตอนบางอย่างในซับเดียวของ @ TokenMacGuy ขั้นแรกเขาใช้mapฟังก์ชันเพื่อแปลงแต่ละรายการในรายการเป็นสตริง (จริงๆแล้วเขากำลังสร้างรายการใหม่ไม่ใช่การแปลงรายการในรายการเก่า) จากนั้นเขาก็ใช้วิธีการสตริงjoinเพื่อรวมสตริงเหล่านั้นเข้าด้วยกัน', 'กัน ส่วนที่เหลือเป็นเพียงการจัดรูปแบบสตริงซึ่งค่อนข้างตรงไปตรงมา (แก้ไข: อินสแตนซ์นี้ตรงไปตรงมาการจัดรูปแบบสตริงโดยทั่วไปอาจค่อนข้างซับซ้อน)

โปรดทราบว่าการใช้joinเป็นวิธีที่ง่ายและมีประสิทธิภาพในการสร้างสตริงจากสตริงย่อยหลายตัวซึ่งมีประสิทธิภาพมากกว่าการทำโดยการเพิ่มสตริงลงในสตริงอย่างต่อเนื่องซึ่งเกี่ยวข้องกับการคัดลอกเบื้องหลังจำนวนมาก

>>> mylist = ['x', 3, 'b']
>>> m = map(str, mylist)
>>> m
['x', '3', 'b']
>>> j = ', '.join(m)
>>> j
'x, 3, b'

2

ใช้.formatสำหรับการจัดรูปแบบสตริง

mylist = ['x', 3, 'b']
print("[{0}]".format(', '.join(map(str, mylist))))

เอาท์พุต:

[x, 3, b]

คำอธิบาย:

  1. mapใช้เพื่อแมปแต่ละองค์ประกอบของรายการที่จะstringพิมพ์
  2. องค์ประกอบถูกรวมเข้าด้วยกันเป็นสตริงโดยมี,ตัวคั่น
  3. เราใช้[และ]ในคำสั่งพิมพ์เพื่อแสดงวงเล็บปีกกา

การอ้างอิง: .formatสำหรับการจัดรูปแบบสตริง PEP-3101


เยี่ยมมาก! ฉันพบว่าใช้.formatวิธี pythonic มากที่สุด แต่แน่นอนฉันยอมรับความไม่เห็นด้วย ;)
loved.by.Jesus

0

ฉันได้รับแรงบันดาลใจจาก @AniMenon ในการเขียนวิธีแก้ปัญหาทั่วไปของ pythonic

mylist = ['x', 3, 'b']
print('[{}]'.format(', '.join(map('{}'.format, mylist))))

มันใช้formatวิธีการเท่านั้น ไม่มีร่องรอยstrและช่วยให้สามารถปรับแต่งรูปแบบองค์ประกอบได้อย่างละเอียด ตัวอย่างเช่นหากคุณมีตัวเลขทศนิยมเป็นองค์ประกอบของรายการคุณสามารถปรับรูปแบบได้โดยการเพิ่มตัวระบุการแปลงในกรณีนี้:.2f

mylist = [1.8493849, -6.329323, 4000.21222111]
print("[{}]".format(', '.join(map('{:.2f}'.format, mylist))))

ผลลัพธ์ค่อนข้างดี:

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