簡體   English   中英

打印二維列表

[英]print two dimensional list

我有一個列表,其中是另一個列表,我想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循環並添加所有子列表?

真正的目標是使它在某種程度上可以用於人類的可讀性,但我不想要你的完成解決方案。

你可以嘗試類似的東西

>>> 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))

您可以做不同的法律事務,任何人都無法在不知道您想要哪一個的情況下說出哪一個是正確的。


首先,你可以只寫strrepra

>>> 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的每個元素的repr連接在一起,這對於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.chain其展平一步,或者使用itertools文檔或使用more-itertools包遞歸處理),然后根據需要對這些部分進行字符串化,然后將它們連接起來。

或者你可以寫下LIST這個詞。

所有這些都是完全有效的東西要傳遞給write

列表理解將是最佳選擇:

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

考慮到性能和語法,這是類似SO問題中最推薦的方法。

我也在尋找答案。 在閱讀了這里的評論之后,這就是我想出的:

我也在尋找答案。 在閱讀了這里的評論之后,這就是我想出的:

','.join(str(' '.join(str(x) for x in v)) for v in a)

這創造了類似的東西:

1 2 hello,3 5 hi There,5 7 I don't know

如果你想要所有空格作為分隔符,那么在前面使用''代替','。

那么使用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])))

我很難確定,因為你的問題太短了,但在我看來你處於XY問題,也就是說:
你問一個關於Y問題的問題,你認為這是一個需要解決的問題,以解決一個艱難的X問題。 但你真正的問題是你認為Y問題是回答真正問題X的方法,而你在這里只提出Y問題。
寫這個,我只是解釋這里所說的: XY問題

如果我是對的,我的意見是,您將有更好的方法使用以下工具之一來解決您的真實X問題,這些工具允許序列化對象並將序列化對象記錄在文件中:

泡菜

元帥

擱置

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

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

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))

你也可以使用這樣一個簡單的列表理解:

doc.write([x for x in i for i in a])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM