11

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

本当の目標は、人間が読めるようにすることでしたが、私はあなたからの完成した解決策を望んでいませんでした.

4

7 に答える 7

13

次のようなものを試すことができます

>>> 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))
于 2013-10-31T22:40:26.680 に答える
4

法的にできることはいくつかありますが、どちらが正しいかは誰にもわかりません。


まず、strorreprを書くことができます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(それはstrあなたが与えたものの を出力します — ただし、リストでは、strは と同じですrepr; それらは両方とも実質的に です'[' + ', '.join(map(repr, self)) + ']')。


2 つ目は、JSON のように、データの永続性のために設計された形式を使用できます。

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

a第 3 に、選択した何らかの方法での各要素の repr を結合できますmap。例えば:

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

…または…</p>

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

または、同じことを再帰的に行うこともできます。

または、リストをフラット化して (たとえば、1 ステップでフラット化するか、ドキュメントやパッケージitertools.chainのレシピを使用して再帰的にフラット化します)、必要に応じて断片を文字列化して結合することもできます。itertoolsmore-itertools

または、単に単語を書くこともできますLIST

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

于 2013-10-31T22:43:45.787 に答える
3

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

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

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

于 2013-10-31T22:44:15.417 に答える
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])))
于 2013-10-31T22:38:38.763 に答える
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))
于 2013-10-31T22:57:11.917 に答える