2013-10-31 199 views
6

我有一個清單,這是另一個列表,我想doc.write(a)轉換列表轉換爲字符串

a = [[1, 2, "hello"], 
    [3, 5, "hi There"], 
    [5,7,"I don't know"]] 
doc.write(''.join(a)) 



TypeError: sequence item 0: expected str instance, list found 

我怎樣才能解決這個問題,我必須做一個for循環中,我加入並添加所有的子列表?

真正的目標是讓它對人類來說是不可讀的,但我不想從你那裏得到完整的解決方案。

+0

你怎麼想的數字呢? –

+3

請顯示你想要的實際輸出。 – abarnert

+0

我想在文本文件中寫入列表。不知何故。 – inetphantom

回答

10

你可以嘗試像

>>> a = [[1, 2, "hello"],[3, 5, "hi There"],[5,7,"I don't know"]] 
>>> 
>>> ''.join(str(r) for v in a for r in v) 
"12hello35hi There57I don't know" 

doc.write(''.join(str(r) for v in a for r in v)) 
0

使用itertools怎麼樣?

from itertools import chain 
doc.write(''.join(map(str, chain(a)))) 

或者:

doc.write(''.join(str(i) for sub_list in a for i in sub_list)) 

您提出了使用for循環。你確實可以這樣做,儘管上面的選項可能會更好。

new_a = [] 
for sub_list in a: 
    for i in sublist: 
     new_a.append(str(i)) 
doc.write(''.join(new_a)) 

這基本上是前面的選項,但展開。

除非你想只寫第一個列表,在這種情況下,你可以這樣做:

doc.write(''.join(map(str, a[0]))) 
3

有是你可以做的不同的法律事情,任何人都無法在不知道你是哪一個的情況下說出哪一個是對的想。


首先,你可以只寫的astrrepr

>>> a=[[1, 2, "hello"],[3, 5, "hi There"],[5,7,"I don't know"]] 
>>> repr(a) 
'[[1, 2, \'hello\'], [3, 5, \'hi There\'], [5, 7, "I don\'t know"]]' 

注意,這是print做什麼(它打印任何的str你給它 - 雖然名單, strrepr相同;它們都是有效的'[' + ', '.join(map(repr, self)) + ']')。


其次,你可以使用它的設計數據持久化的格式,如JSON:

>>> json.dumps(a) 
'[[1, 2, "hello"], [3, 5, "hi There"], [5, 7, "I don\'t know"]]' 

第三,你可以聯合起來的a每個元素的再版中的一些方法你的選擇,這是微不足道的或map或理解。例如:

>>> '[' + ', '.join(map(repr, a)) + ']' 
'[[1, 2, \'hello\'], [3, 5, \'hi There\'], [5, 7, "I don\'t know"]]' 

......或者......

>>> 'My stuff includes: ' + ','.join(map(repr, a)) + '\n' 
'My stuff includes: [1, 2, \'hello\'],[3, 5, \'hi There\'],[5, 7, "I don\'t know"]\n' 

或者你也可以做同樣的事情遞歸。

或者您可以拼合列表(例如,從itertools文檔或與more-itertools包配方壓平一個步驟itertools.chain,或遞歸),然後,但是你想字符串化的碎片,然後加入他們的行列了。

或者你可以只寫字LIST

所有這些都是完全有效的事情傳遞到write

3

列表理解將是最好的選擇:

>>> ''.join([str(item) for sublist in a for item in sublist]) 
"12hello35hi There57I don't know" 

這是最值得推薦的做法在similar SO question,考慮到性能和語法。

0

我很難確定,因爲你的問題太短,但在我看來,你是在XY問題,也就是說:
你問一個關於你認爲是Y問題的問題作爲一個需要解決的問題而走出困境的X問題。但是你真正的問題是你認爲Y問題是回答真正問題X的方法,而你在這裏只提出Y問題。
寫作,我只是套用什麼是在此間表示:XY problem

如果我是正確的,我的看法是,你將有一個更好的辦法來解決使用以下工具,允許序列化一個你真正的X問題一個對象,記錄序列化對象的文件:

pickle

marshal

shelve

我不會解釋和重複所有關於這些工具的文檔,請閱讀它們。

,如果我錯了,你真的只想寫一個字符串表示的形式下一個對象,你也可以這樣做:

from pprint import pformat 

a = [[1, 2, "hello"], 
    [3, 5, "hi There"], 
    [5,7,"I don't know"]] 

with open('doc.txt','w') as f: 
    f.write(pformat(a,width=12)) 
+0

這不僅僅是一個答案而是一個評論。 – abarnert

+0

我不認爲這有幫助。 OP不會問如何做錯誤的事情(例如用正則表達式解析XML),而是一個合理的問題。您給出的模塊在寫入人類可讀的「**文本**文件」(我的強調)方面並不是很有幫助,我相信只有鏈接的答案是不鼓勵的。 – rlms

+0

@abarnert我習慣性地感謝你的回答和評論,但是現在我不明白你的評論。在我看來,關鍵的一點是:當我認爲OP試圖找到一種方法來解決他的問題而不是找到一個真正的好的和適應性的解決方案時,我是對的。如果是的話,我的建議,這個回答他的X問題,而不是回答Y僞解決方案,在我看來,值得與其他答案一樣多的答案格式。 – eyquem