列表在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']
列表在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']
最簡單的方法是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
,但這不適用於'+'技巧,因此您必須改寫每個元素。
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
除非你有你正在評估的字符串超自然的信任;儘管限於簡單的常量,但它是完全安全的,因此通常更可取。
請注意,ast模塊僅適用於Python 2.6及更高版本。 – 2009-12-08 18:23:49
@Zach,yep,2.5有'_ast',但這是較低的水平,因此很難合作。 – 2009-12-08 18:51:22
嘗試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
可能是危險的。不要將它用於從用戶處接收並且未經過驗證的輸入。
你需要先將他們eval
然後你可以總結結果。但是我想知道你是如何得到這些琴絃的?
的快速和骯髒的方法是使用eval
:
SumLine = eval(line1) + eval(line2) + eval(line3) + eval(line4)
但不這樣做,如果你是從別人(即用戶輸入)
你從哪裏得到這些字符串?任何缺乏真正解析器的東西都會變得脆弱。下面是我會推薦的,如果我以前沒有見過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']
分析列表,你可以比去參加解析名單。
我希望你在這些字符串的中間沒有任何逃脫的單引號,否則你也會影響內容......錯誤! – 2009-12-08 19:24:11
literal_eval不適用於+,只有文字。 – 2009-12-08 18:27:23
@Zach,是的,這給'ValueError:格式不正確的字符串。如果人們在接受他們之前最低限度地嘗試了答案,這不是很好嗎?) – 2009-12-08 18:37:16
我猜他選擇了簡單的'eval'版本。我刪除了literal_eval的不正確代碼。 – 2009-12-08 18:53:39