別のリストであるリストがあり、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))
あなたができるさまざまな合法的なことがあり、あなたが望むものを知らずに誰もがどれが正しいかを言う方法はありません。
まず、str
のrepr
または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)) + ']'
)です。
次に、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
に渡すのに完全に有効なものです。
リスト内包表記が最良の選択です。
>>> ''.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
すべてのスペースを区切り文字として使用する場合は、先頭に「、」ではなく「」を使用します。
次のような単純なリスト内包表記を使用することもできます。
doc.write([x for x in i for i in a])
あなたの質問が短すぎるので、私が確信するのは難しいですが、あなたは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))
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])))