bounds = cursor.fetchone()
檢索從SQL查詢數據,我得到這樣一個元組:
(34.2424, -64.2344, 76.3534, 45.2344)
,我會喜歡有一個像34.2424 -64.2344 76.3534 45.2344
是否有一個函數可以做到這一點?
bounds = cursor.fetchone()
檢索從SQL查詢數據,我得到這樣一個元組:
(34.2424, -64.2344, 76.3534, 45.2344)
,我會喜歡有一個像34.2424 -64.2344 76.3534 45.2344
是否有一個函數可以做到這一點?
使用str.join()
:
>>> mystring = ' '.join(map(str, (34.2424, -64.2344, 76.3534, 45.2344)))
>>> print mystring
34.2424 -64.2344 76.3534 45.2344
你必須在這裏使用地圖(其中的所有項目轉換的元組字符串),否則你會得到一個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)案例中,任何一個選項並不重要,因爲在這裏的表現看起來並不是什麼大問題。但是,如果你曾經處理過浮點/整數的大元組,那麼現在你知道如何使用以獲得最大效率:)。
嘗試彩車這個
>>> a = (34.2424, -64.2344, 76.3534, 45.2344)
>>> ' '.join(str(i) for i in a)
'34.2424 -64.2344 76.3534 45.2344
寫入''[str(i)for i in a]',這意味着在''''.join()''必須工作之前首先創建一個列表對象。但是可以在''中寫入''''.join(str(i)):在這種情況下,join()''獲取每個'str(i)''在另一個之後由發生器''str(i)for i in a)''。另見我對海德羅的回答的評論。 – eyquem
@eyquem是的,這是正確的,謝謝你提及 –
其實列表理解與加入更好:http://stackoverflow.com/a/9061024/1240268 –
如果我有你的消息,你得到的元組,對嗎?
如果是的話,下面的代碼應該工作:
In [1]: t = (34.2424 , -64.2344 , 76.3534 , 45.2344)
In [2]: ' '.join([str(x) for x in t])
Out[2]: '34.2424 -64.2344 76.3534 45.2344'
我們在每一個元組值轉換爲字符串,在這裏,因爲str.join
方法可以用字符串列表纔有效。 如果t
是一個字符串元組,代碼將只是' '.join(t)
。
如果你在格式"(34.2424 , -64.2344 , 76.3534 , 45.2344)"
獲取字符串,你首先應該擺脫unnescessary parthensis和逗號:
In [3]: t = "(34.2424 , -64.2344 , 76.3534 , 45.2344)"
In [4]: t.strip('()')
Out[4]: '34.2424 , -64.2344 , 76.3534 , 45.2344'
In [5]: numbers = t.strip('()')
In [6]: numbers.split(' , ')
Out[6]: ['34.2424', '-64.2344', '76.3534', '45.2344']
In [7]: ' '.join(numbers.split(' , '))
Out[7]: '34.2424 -64.2344 76.3534 45.2344'
我建議你閱讀我的評論Ronan的答案 – eyquem
您還可以使用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 |
從這裏,你的字符串formatting options非常多樣化。
你的解決方案比使用地圖或列表理解更快,即:1.72每循環usec而不是1.87 –
你可以簡單地使用下面的代碼:
i = 0
for row in data:
print(row[i])
i++
在Python 3,你的答案是好的,因爲''圖()''是在Python 3而在Python2發電機,它會更好使用''imap()'' – eyquem
@eyquem我不認爲性能是一個巨大的問題在這裏:p – TerryA
@eyquem實際上它更快,更有效地使用list comp而不是生成器來進行連接:http:// stackoverflow.com/a/9061024/1240268 –