11

混合したリスト(配列)があります

a = ["x", "2", "y"]
b = ["x", 2, "y"]
print ":".join(a)
print ":".join(b)

最初の結合は機能しますが、2 番目の結合は TypeError 例外をスローします

私はこれを思いつきましたが、これは Python ソリューションですか?

print ":".join(map(str, b))

結局のところ、この文字列をファイルに書きたいだけなので、そのための具体的な解決策があれば、それもありがたいです。

4

1 に答える 1

11

あなたのソリューションはうまく機能し、おそらく中小規模のリストに対してこれを行うための最速の方法の1つですが、不要なリストを作成します(python2.x)。通常は問題ありませんが、オブジェクトによっては問題になる場合bがあります。python2とpython3で怠惰なもう1つは次のとおりです。

':'.join(str(x) for x in b)

Python 2.7.3のいくつかのタイミング:

$ python -m timeit -s 'b = ["x", 2, "y"]' '":".join(map(str,b))'
1000000 loops, best of 3: 1.66 usec per loop
$python -m timeit -s 'b = ["x", 2, "y"]' '":".join([str(x) for x in b])'
1000000 loops, best of 3: 1.49 usec per loop
$ python -m timeit -s 'b = ["x", 2, "y"]' '":".join(str(x) for x in b)'
100000 loops, best of 3: 3.26 usec per loop
$python -m timeit -s 'from itertools import imap; b = ["x", 2, "y"]' '":".join(imap(str,b))'
100000 loops, best of 3: 2.83 usec per loop

python3.2のいくつかのタイミング:

$ python3 -m timeit -s 'b = ["x", 2, "y"]' '":".join(map(str,b))'
100000 loops, best of 3: 2.6 usec per loop
$ python3 -m timeit -s 'b = ["x", 2, "y"]' '":".join([str(x) for x in b])'
100000 loops, best of 3: 2.08 usec per loop
$ python3 -m timeit -s 'b = ["x", 2, "y"]' '":".join(str(x) for x in b)'
100000 loops, best of 3: 3.39 usec per loop

ループを大きくすると、違いの重要性が低くなることに注意してください。

python2.7.3:

$ python -m timeit -s 'b = list(range(10000))' '":".join(str(x) for x in b)'
100 loops, best of 3: 4.83 msec per loop
$ python -m timeit -s 'b = list(range(10000))' '":".join([str(x) for x in b])'
100 loops, best of 3: 4.33 msec per loop
$ python -m timeit -s 'b = list(range(10000))' '":".join(map(str,b))'
100 loops, best of 3: 3.29 msec per loop

Python 3.2.0

$ python3 -m timeit -s 'b = list(range(10000))' '":".join(str(x) for x in b)'
100 loops, best of 3: 6.42 msec per loop
$ python3 -m timeit -s 'b = list(range(10000))' '":".join([str(x) for x in b])'
100 loops, best of 3: 5.51 msec per loop
$ python3 -m timeit -s 'b = list(range(10000))' '":".join(map(str,b))'
100 loops, best of 3: 4.55 msec per loop

*すべてのタイミングは私のMacbookPro、OS-X 10.5.8intelcore2duoで行われました...。

ノート、

  • python2.xは、すべての場合でpython3.xよりも高速です(私にとって)
  • リスト内包表記は、サンプルリストでは最速ですが、リストがmap大きいほど高速です。 map関数を検索する必要があるため、小さなリストの場合はおそらく遅くなりますが、リスト内包表記は「シャドウ」できないため、検索を実行する必要はありません。中間リストの作成にかかる時間が重要になる、巨大なリスト別のターンアラウンドポイントがあるかもしれません。
  • ジェネレータ式は常に最も遅いです(ただし、どちらの場合も怠惰です)
于 2012-12-19T14:15:12.627 に答える