web-dev-qa-db-ja.com

Python 3でスペースで区切られた要素のリストを印刷する

自然数など、要素のリストLがあります。 シングルスペースをセパレータとして1行で印刷したい。しかし、私は不要リストの最後の要素の後(または最初の要素の前)のスペース。

Python 2)では、これは次のコードで簡単に行えます。printステートメントの実装(不可解なことに、私は告白しなければなりません)は、改行の前に余分なスペースを印刷することを回避。

L = [1, 2, 3, 4, 5]
for x in L:
    print x,
print

ただし、Python 3)では、print関数を使用する(おそらく)同等のコードは、最後の数字の後にスペースを生成するようです。

L = [1, 2, 3, 4, 5]
for x in L:
    print(x, end=" ")
print()

もちろん、私の質問には簡単な答えがあります。私は文字列連結を使用できることを知っています:

L = [1, 2, 3, 4, 5]
print(" ".join(str(x) for x in L))

これは非常に良い解決策ですが、Python 2コードと比較すると、直感に反し、間違いなく遅いことがわかります。また、自分でスペースを印刷するかしないかを選択できることも知っています。 :

L = [1, 2, 3, 4, 5]
for i, x in enumerate(L):
    print(" " if i>0 else "", x, sep="", end="")
print()

しかし、これもPython 2。

だから、私の質問は、Python 3に何かが欠けていますか?私が探している動作はprint関数によってサポートされていますか?

29
nickie

リストを個別の引数として適用できます。

_print(*L)
_

そして、print()が各要素を文字列に変換するようにします。いつものように、sepキーワード引数を設定することでセパレータを制御できます:

_>>> L = [1, 2, 3, 4, 5]
>>> print(*L)
1 2 3 4 5
>>> print(*L, sep=', ')
1, 2, 3, 4, 5
>>> print(*L, sep=' -> ')
1 -> 2 -> 3 -> 4 -> 5
_

他の何かに結合された文字列が必要でない限り、これが最も簡単な方法です。それ以外の場合は、str.join()を使用します。

_joined_string = ' '.join([str(v) for v in L])
print(joined_string)
# do other things with joined_string
_

これには、L!の文字列以外の値を文字列に手動で変換する必要があることに注意してください。

83
Martijn Pieters

受け入れられた答えは絶対に明確ですが、時間の面で効率をチェックしたかっただけです。

最良の方法は、結合された数値の文字列を文字列に変換して出力することです。

print(" ".join(list(map(str,l))))

loopの代わりにmapを使用したことに注意してください。時間を比較するための4つの異なる方法すべての小さなコードを作成しました。

import time as t

a, b = 10, 210000
l = list(range(10, 21000))
tic = t.time()
for i in l:
    print(i, end=" ")

print()
tac = t.time()
t1 = (tac - tic) * 1000
print(*l)
toe = t.time()
t2 = (toe - tac) * 1000
print(" ".join([str(i) for i in l]))
joe = t.time()
t3 = (joe - toe) * 1000
print(" ".join(list(map(str, l))))
toy = t.time()
t4 = (toy - joe) * 1000
print("Time,t1,t2,t3,t4")

結果:

時間74344.76 71790.83 196.99 153.99

出力は私にとって非常に驚くべきものでした。 「ループ法」と「結合文字列法」の場合の時間の大きな違い。

結論:サイズが大きすぎる場合(10 ** 5以上のオーダー)、リストの印刷にループを使用しないでください。

2
Amit Dwivedi
list = [1, 2, 3, 4, 5]
for i in list[0:-1]:
    print(i, end=', ')
print(list[-1])

forループの実行に本当に長い時間がかかりますか?

リスト内のすべてのstr値をコンマで区切って印刷し、最後のエントリの前に「and」を挿入して、これを思いついたものを作成しようとしていました。

spam = ['apples', 'bananas', 'tofu', 'cats']
for i in spam[0:-1]:
    print(i, end=', ')
print('and ' + spam[-1])
0
mashkitty