19

を使用してSQLクエリからデータを取得しました

bounds = cursor.fetchone()

そして、次のようなタプルを取得します。

(34.2424, -64.2344, 76.3534, 45.2344)

そして、私は次のような文字列が欲しいです34.2424 -64.2344 76.3534 45.2344

それができる機能はありますか?

4

6 に答える 6

39

使用str.join():

>>> mystring = ' '.join(map(str, (34.2424, -64.2344, 76.3534, 45.2344)))
>>> print mystring
34.2424 -64.2344 76.3534 45.2344

ここで map を使用する必要があります (タプル内のすべての項目を文字列に変換します) TypeError


map()関数について少し説明します。

map(str, (34.2424, -64.2344, 76.3534, 45.2344)と同等[str(i) for i in (34.2424, -64.2344, 76.3534, 45.2344)]です。

リスト内包表記を使用するよりも少し高速です。

$ python -m timeit "map(str, (34.2424, -64.2344, 76.3534, 45.2344))"
1000000 loops, best of 3: 1.93 usec per loop
$ python -m timeit "[str(i) for i in (34.2424, -64.2344, 76.3534, 45.2344)]"
100000 loops, best of 3: 2.02 usec per loop

この回答へのコメントに示されているようにstr.join()、リストの代わりにジェネレーターを使用できます。通常、これは高速ですが、この場合は遅くなります

私がするなら:

' '.join(itertools.imap(str, (34.2424, -64.2344, 76.3534, 45.2344)))

を使用するよりも遅くなりますmap()。違いはimap()、ジェネレーターを返すことですmap()が、リストを返します (python 3 ではジェネレーターを返します)。

私がするなら:

''.join(str(i) for i in (34.2424, -64.2344, 76.3534, 45.2344))

hereで説明されている理由により、リスト内包表記を括弧で囲むよりも遅くなります。


あなたの(OPの)ケースでは、パフォーマンスはここでは大したことではないように見えるため、どちらのオプションも実際には重要ではありません。しかし、浮動小数点数/整数の大きなタプルを扱ったことがある場合は、最大の効率のために何を使用すればよいかがわかります:)。

于 2013-07-02T13:04:20.443 に答える
6

マジックstr.format()を使用したい場合は、任意のフォーマットを生成するために を使用することもできます。*この質問の特定のケースを単一の区切り記号で処理するのは、実際には少し面倒です。

>>> bounds = (34.2424, -64.2344, 76.3534, 45.2344)
>>> "{} {} {} {}".format(*bounds)

34.2424 -64.2344 76.3534 45.2344

のような任意の長さを処理するより堅牢なバージョンjoinは次のとおりです。

>>> len(bounds)*"{} ".format(*bounds)

しかし、追加された価値は、フォーマットをより複雑なものに拡張したい場合、次のオプションがあることです。

>>> "{} --> | {:>10} | {:>10} | {:>10} |".format(*bounds)

34.2424 --> |   -64.2344 |    76.3534 |    45.2344 |

ここから、文字列の書式設定オプションは非常に多様になります。

于 2015-03-21T05:14:27.300 に答える
3

これを試して

>>> a = (34.2424, -64.2344, 76.3534, 45.2344)
>>> ' '.join(str(i) for i in a)
'34.2424 -64.2344 76.3534 45.2344
于 2013-07-02T13:06:24.703 に答える