2009-12-08 56 views
4

列表在Python我有四根弦,其中包括一個清單的格式:轉換和合並字符串轉換爲在Python

line1 ="['a.b.c','b.c.a','c.d.e']" 
line2 ="['def','efg']" 
line3 ="['f']" 
line4 ="['g']" 

如何合併所有這些,所以我得到一個有效的Python列表,例如:

SumLine = ['a.b.c','b.c.a','c.d.e','def','efg','f','g'] 

回答

2

最簡單的方法是concetenate在獲得這些字符串字符串表達式可以evaulated,提供所需的結果:

line1 ="['a.b.c','b.c.a','c.d.e']" 
line2 ="['def','efg']" 
line3 ="['f']" 
line4 ="['g']" 
lines = [line1, line2, line3, line4] 

print eval('+'.join(lines)) 

然而,這是不安全的,如果你不能信任你的輸入,因此,如果您正在使用PYT 2.6或更高版本,您應該在ast模塊中使用安全評估函數ast.literal_eval,但這不適用於'+'技巧,因此您必須改寫每個元素。

+2

literal_eval不適用於+,只有文字。 – 2009-12-08 18:27:23

+0

@Zach,是的,這給'ValueError:格式不正確的字符串。如果人們在接受他們之前最低限度地嘗試了答案,這不是很好嗎?) – 2009-12-08 18:37:16

+0

我猜他選擇了簡單的'eval'版本。我刪除了literal_eval的不正確代碼。 – 2009-12-08 18:53:39

11
import ast 

line1 ="['a.b.c','b.c.a','c.d.e']" 
line2 ="['def','efg']" 
line3 ="['f']" 
line4 ="['g']" 

SumLine = [] 

for x in (line1, line2, line3, line4): 
    SumLine.extend(ast.literal_eval(x)) 

print SumLine 

不要使用內置eval除非你有你正在評估的字符串超自然的信任;儘管限於簡單的常量,但它是完全安全的,因此通常更可取。

+4

請注意,ast模塊僅適用於Python 2.6及更高版本。 – 2009-12-08 18:23:49

+0

@Zach,yep,2.5有'_ast',但這是較低的水平,因此很難合作。 – 2009-12-08 18:51:22

1

嘗試eval

>>> line1 ="['a.b.c','b.c.a','c.d.e']" 
>>> line2 ="['def','efg']" 
>>> line3 ="['f']" 
>>> line4 ="['g']" 
>>> eval(line1) + eval(line2) + eval(line3) + eval(line4) 
['a.b.c', 'b.c.a', 'c.d.e', 'def', 'efg', 'f', 'g'] 

但要小心,因爲eval可能是危險的。不要將它用於從用戶處接收並且未經過驗證的輸入。

0

你需要先將他們eval然後你可以總結結果。但是我想知道你是如何得到這些琴絃的?

1

的快速和骯髒的方法是使用eval

SumLine = eval(line1) + eval(line2) + eval(line3) + eval(line4) 

但不這樣做,如果你是從別人(即用戶輸入)

1

你從哪裏得到這些字符串?任何缺乏真正解析器的東西都會變得脆弱。下面是我會推薦的,如果我以前沒有見過Alex Martelli的輝煌答案的話!

您可以將它們解析爲JSON數組,但JSON想要讀取雙引號字符串,而不是單引號。這給方法帶來了脆弱性,但仍然比不安全的eval()更可取。

import json 
line1 ="['a.b.c','b.c.a','c.d.e']" 
json.loads(line1.replace("'", '"')) 

結果就像是一個[u'a.b.c', u'b.c.a', u'c.d.e']分析列表,你可以比去參加解析名單。

+0

我希望你在這些字符串的中間沒有任何逃脫的單引號,否則你也會影響內容......錯誤! – 2009-12-08 19:24:11