web-dev-qa-db-ja.com

二次元リストを印刷する

別のリストであるリストがあり、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ループを作成する必要がありますか?

本当の目標は、人間の蜂が読めるようにすることでしたが、完成したソリューションは必要ありませんでした。

10
inetphantom

あなたは次のようなことを試すことができます

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

あなたができるさまざまな合法的なことがあり、あなたが望むものを知らずに誰もがどれが正しいかを言う方法はありません。


まず、strreprまたはaを書くことができます。

_>>> 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が行うことであることに注意してください(リストを使用すると、strstrと同じですが、指定したもののreprを出力します。 ;どちらも事実上'[' + ', '.join(map(repr, self)) + ']')です。


次に、JSONのように、永続的なデータ用に設計された形式を使用できます。

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

第3に、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.chain_で1ステップフラット化するか、itertoolsドキュメントのレシピまたは_more-itertools_パッケージで再帰的にフラット化)、ピースを文字列化することもできます。あなたが望むそしてそれらに参加します。

または、Word LISTと書くこともできます。

これらはすべて、writeに渡すのに完全に有効なものです。

3
abarnert

リスト内包表記が最良の選択です。

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

これは、パフォーマンスと構文を考慮して、 同様のSO質問 で最も推奨されるアプローチです。

3
jlr

私もこれに対する答えを探していました。ここのコメントを読んだ後、これは私が思いついたものです:

私もこれに対する答えを探していました。ここのコメントを読んだ後、これは私が思いついたものです:

','.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

すべてのスペースを区切り文字として使用する場合は、先頭に「、」ではなく「」を使用します。

1
Clash

次のような単純なリスト内包表記を使用することもできます。

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

あなたの質問が短すぎるので、私が確信するのは難しいですが、あなたはXYの問題に直面しているようです、つまり:
あなたは、困難なX問題から抜け出すために解決する必要があるものであるとあなたが考えるY問題について質問します。しかし、あなたの本当の問題は、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))
0
eyquem

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])))
0
rlms