วิธีการแปลงสตริงที่มีรายการคั่นด้วยจุลภาคเป็นรายการใน Python


149

คุณแปลงสตริงเป็นรายการได้อย่างไร?

Say text = "a,b,c"สตริงเป็นเหมือน หลังจากการแปลงที่text == ['a', 'b', 'c']และหวังว่าtext[0] == 'a', text[1] == 'b'?


2
สวัสดีฉันทำแบบนั้นรายการ (stringObject.split (','))
GünayGültekin

คำตอบ:


216

แบบนี้:

>>> text = 'a,b,c'
>>> text = text.split(',')
>>> text
[ 'a', 'b', 'c' ]

หรือคุณสามารถใช้eval()หากคุณเชื่อมั่นว่าสตริงจะปลอดภัย:

>>> text = 'a,b,c'
>>> text = eval('[' + text + ']')

@Clinteney: ไม่มีปัญหา ;-) คุณอาจต้องการตรวจสอบpickleว่าคุณยังคงมีวัตถุอยู่กับสตริงหรือไม่
Cameron

2
นี่ไม่ใช่อาร์เรย์ แต่เป็นรายการอาร์เรย์แสดงถึงค่าพื้นฐานและทำงานเหมือนกับรายการยกเว้นประเภทของวัตถุที่เก็บไว้ในนั้นมีข้อ จำกัด
joaquin

8
คำเตือนที่เป็นมิตร: อย่าใช้ eval แม้ว่าคุณจะเชื่อมั่นว่าสตริงจะปลอดภัยก็ตาม ไม่คุ้มกับอันตรายด้านความปลอดภัยที่อาจเกิดขึ้นได้มากกว่าสคริปต์ส่วนตัวและการเล่นซอในเชลล์แบบโต้ตอบ
อ. วิลสัน

3
eval ('[' + text + ']') จะถือว่า a, b, c เป็นตัวแปรไม่ใช่สตริง
phaibin

1
โหวตลดลงเนื่องจากโซลูชันที่นำเสนอทั้งสองวิธีทำสิ่งที่แตกต่างกันโดยสิ้นเชิงและไม่มีการอธิบายในข้อความคำตอบ แต่อย่างใด แม้ว่าคำถามจะไม่ชัดเจน แต่ก็ควรระบุคำตอบให้ชัดเจนว่าทั้งสองวิธีไม่ใช่ทางเลือกที่เทียบเท่ากัน แต่เป็นการตีความคำถามที่แตกต่างกัน
Matteo Italia

182

เพียงเพื่อเพิ่มคำตอบที่มีอยู่: หวังว่าคุณจะพบบางสิ่งเช่นนี้ในอนาคต

>>> word = 'abc'
>>> L = list(word)
>>> L
['a', 'b', 'c']
>>> ''.join(L)
'abc'

แต่สิ่งที่คุณกำลังจัดการอยู่ตอนนี้ไปกับคำตอบของ@ Cameron

>>> word = 'a,b,c'
>>> L = word.split(',')
>>> L
['a', 'b', 'c']
>>> ','.join(L)
'a,b,c'

4
แม้ว่าฉันจะเห็นด้วยกับคุณว่าคำตอบของ @ Cameron คือคำตอบ "ตอนนี้" แต่ฉันคิดว่าความละเอียดถี่ถ้วนของคุณทำให้คำตอบนี้ถูกต้องมากขึ้น เราไม่ค่อยได้รับสตริงที่คั่นด้วยจุลภาคในโลกแห่งความเป็นจริงและเป็นการดีที่จะรู้วิธีแปลงเป็นรายการโดยไม่คำนึงถึงรูปแบบ
TristanZimmerman

40

รหัส Python ต่อไปนี้จะเปลี่ยนสตริงของคุณให้เป็นรายการสตริง:

import ast
teststr = "['aaa','bbb','ccc']"
testarray = ast.literal_eval(teststr)

3
นอกจากนี้ยังสามารถใช้jsonตัวอย่าง:json.loads(teststr)
Mohammad Nazari

นี่ควรเป็นคำตอบที่ยอมรับ
grepit

26

ฉันไม่คิดว่าคุณจำเป็นต้องทำ

ใน python คุณแทบไม่จำเป็นต้องแปลงสตริงเป็นรายการเนื่องจากสตริงและรายการมีความคล้ายคลึงกันมาก

การเปลี่ยนประเภท

หากคุณมีสตริงที่ควรเป็นอาร์เรย์อักขระให้ทำดังนี้

In [1]: x = "foobar"
In [2]: list(x)
Out[2]: ['f', 'o', 'o', 'b', 'a', 'r']

ไม่เปลี่ยนประเภท

โปรดทราบว่า Strings นั้นเหมือนกับรายการใน python มาก

สตริงมีตัวเข้าถึงเช่นรายการ

In [3]: x[0]
Out[3]: 'f'

สตริงสามารถทำซ้ำได้เช่นรายการ

In [4]: for i in range(len(x)):
...:     print x[i]
...:     
f
o
o
b
a
r

TLDR

สตริงคือรายการ เกือบ.


8

ในกรณีที่คุณต้องการแบ่งตามช่องว่างคุณสามารถใช้.split():

a = 'mary had a little lamb'
z = a.split()
print z

เอาท์พุต:

['mary', 'had', 'a', 'little', 'lamb'] 

สิ่งนี้จะส่งออกสิ่งที่อยู่ระหว่าง()คือไม่มีอะไรเลย
Anthon

7

หากคุณต้องการอาร์เรย์จริง:

>>> from array import array
>>> text = "a,b,c"
>>> text = text.replace(',', '')
>>> myarray = array('c', text)
>>> myarray
array('c', 'abc')
>>> myarray[0]
'a'
>>> myarray[1]
'b'

หากคุณไม่ต้องการอาร์เรย์และต้องการดูโดยดัชนีที่อักขระของคุณเท่านั้นโปรดจำไว้ว่าสตริงสามารถทำซ้ำได้เช่นเดียวกับรายการยกเว้นข้อเท็จจริงที่ว่าไม่เปลี่ยนรูป:

>>> text = "a,b,c"
>>> text = text.replace(',', '')
>>> text[0]
'a'

1
ด้วยความอยากรู้หลังจากที่คุณทำ myarray = array ('c', text) "c" ไปไหน? เนื่องจากถ้าคุณพิมพ์อาร์เรย์คุณจะได้อาร์เรย์ ("c", "abc") แต่ a [0] == a? ขอบคุณ
Clinteney Hui

@Clinteney: 'c' หมายถึง "สร้างอาร์เรย์ของอักขระ" ดูเอกสารสำหรับข้อมูลเพิ่มเติม
คาเมรอน

ฉันได้รับการโหวตแล้ว แต่เร็วเกินไป ฉันได้รับอาร์เรย์ ('c', '1 1 91 0.001 228')เมื่อเรียกa = array ('c', e)โดยที่e = "1 1 91 0.001 228"
Valentin Heinitz

@ValentinHeinitz ใช่นั่นคือสิ่งที่คุณต้องได้รับดังที่แสดงในตัวอย่างของฉัน คุณคาดหวังอะไร ?
joaquin

1
@joaquin: โอเคฉันเข้าใจแล้ว ทุกอย่างเหมาะสมกับคำตอบ ฉันสับสนกับคำถาม "text == [a, b, c]" ควรเป็น "text == ['a', 'b', 'c']"
Valentin Heinitz

5
m = '[[1,2,3],[4,5,6],[7,8,9]]'

m= eval(m.split()[0])

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

โปรดให้ข้อมูลเพิ่มเติมพร้อมกับรหัสของคุณเพื่อให้ผู้โพสต์ต้นฉบับเข้าใจวิธีแก้ปัญหาของเขาได้ดีขึ้น
Ivan

4

คำตอบทั้งหมดเป็นสิ่งที่ดีมีอีกวิธีในการทำนั่นคือการทำความเข้าใจรายการดูวิธีแก้ปัญหาด้านล่าง

u = "UUUDDD"

lst = [x for x in u]

สำหรับรายการที่คั่นด้วยลูกน้ำให้ทำดังต่อไปนี้

u = "U,U,U,D,D,D"

lst = [x for x in u.split(',')]

ฉันไม่เข้าใจบรรทัดเดียวสำหรับลูปและจะไม่มีวัน
Mr PizzaGuy

1
@MrPizzaGuy มันง่ายและมีประโยชน์มากเมื่อคุณใช้งานตรวจสอบyoutube.com/watch?v=AhSvKGTh28Q
waghydjemy


1

ในการแปลงการstringมีแบบฟอร์มที่a="[[1, 3], [2, -6]]"ฉันเขียนโค้ด แต่ยังไม่ได้ปรับให้เหมาะสม

matrixAr = []
mystring = "[[1, 3], [2, -4], [19, -15]]"
b=mystring.replace("[[","").replace("]]","") # to remove head [[ and tail ]]
for line in b.split('], ['):
    row =list(map(int,line.split(','))) #map = to convert the number from string (some has also space ) to integer
    matrixAr.append(row)
print matrixAr

0
# to strip `,` and `.` from a string ->

>>> 'a,b,c.'.translate(None, ',.')
'abc'

คุณควรใช้translateวิธีการในตัวสำหรับสตริง

พิมพ์help('abc'.translate)ที่ Python shell เพื่อดูข้อมูลเพิ่มเติม



0

ตัวอย่าง 1

>>> email= "myemailid@gmail.com"
>>> email.split()
#OUTPUT
["myemailid@gmail.com"]

ตัวอย่าง 2

>>> email= "myemailid@gmail.com, someonsemailid@gmail.com"
>>> email.split(',')
#OUTPUT
["myemailid@gmail.com", "someonsemailid@gmail.com"]

0

split()เป็นเพื่อนของคุณที่นี่ ฉันจะพูดถึงบางแง่มุมsplit()ที่ไม่ครอบคลุมโดยคำตอบอื่น ๆ

  • หากไม่มีการส่งผ่านอาร์กิวเมนต์split()จะแบ่งสตริงตามอักขระเว้นวรรค (ช่องว่างแท็บและขึ้นบรรทัดใหม่) ช่องว่างนำหน้าและต่อท้ายจะถูกละเว้น นอกจากนี้ช่องว่างที่ติดต่อกันจะถือว่าเป็นตัวคั่นตัวเดียว

ตัวอย่าง:

>>> "   \t\t\none  two    three\t\t\tfour\nfive\n\n".split()
['one', 'two', 'three', 'four', 'five']
  • เมื่อมีการส่งผ่านตัวคั่นอักขระเดียวจะsplit()ทำงานแตกต่างจากพฤติกรรมเริ่มต้น ในกรณีนี้ตัวคั่นนำหน้า / ต่อท้ายจะไม่ถูกเพิกเฉยตัวคั่นที่ทำซ้ำจะไม่ "รวมกัน" เป็นตัวเดียว

ตัวอย่าง:

>>> ",,one,two,three,,\n four\tfive".split(',')
['', '', 'one', 'two', 'three', '', '\n four\tfive']

ดังนั้นหากต้องการขีดฆ่าช่องว่างในขณะที่แยกสตริงโดยใช้ตัวคั่นที่ไม่ใช่ช่องว่างให้ใช้โครงสร้างนี้:

words = [item.strip() for item in string.split(',')]
  • เมื่อสตริงหลายอักขระถูกส่งผ่านเป็นตัวคั่นสตริงจะถูกใช้เป็นตัวคั่นเดียวและไม่ใช้เป็นคลาสอักขระหรือชุดของตัวคั่น

ตัวอย่าง:

>>> "one,two,three,,four".split(',,')
['one,two,three', 'four']

ในการรวมตัวคั่นหลายตัวเข้าด้วยกันคุณจะต้องใช้re.split(regex, string)วิธีการ ดูโพสต์ที่เกี่ยวข้องด้านล่าง


ที่เกี่ยวข้อง

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