2013-07-02 98 views

回答

30

使用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)案例中,任何一個選項並不重要,因爲在這裏的表現看起來並不是什麼大問題。但是,如果你曾經處理過浮點/整數的大元組,那麼現在你知道如何使用以獲得最大效率:)。

+0

在Python 3,你的答案是好的,因爲''圖()''是在Python 3而在Python2發電機,它會更好使用''imap()'' – eyquem

+0

@eyquem我不認爲性能是一個巨大的問題在這裏:p – TerryA

+1

@eyquem實際上它更快,更有效地使用list comp而不是生成器來進行連接:http:// stackoverflow.com/a/9061024/1240268 –

1

嘗試彩車這個

>>> a = (34.2424, -64.2344, 76.3534, 45.2344) 
>>> ' '.join(str(i) for i in a) 
'34.2424 -64.2344 76.3534 45.2344 
+1

寫入''[str(i)for i in a]',這意味着在''''.join()''必須工作之前首先創建一個列表對象。但是可以在''中寫入''''.join(str(i)):在這種情況下,join()''獲取每個'str(i)''在另一個之後由發生器''str(i)for i in a)''。另見我對海德羅的回答的評論。 – eyquem

+1

@eyquem是的,這是正確的,謝謝你提及 –

+0

其實列表理解與加入更好:http://stackoverflow.com/a/9061024/1240268 –

4

如果我有你的消息,你得到的元組,對嗎?

如果是的話,下面的代碼應該工作:

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' 
+0

我建議你閱讀我的評論Ronan的答案 – eyquem

2

您還可以使用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非常多樣化。

+0

你的解決方案比使用地圖或列表理解更快,即:1.72每循環usec而不是1.87 –

-1

你可以簡單地使用下面的代碼:

i = 0 
for row in data: 
     print(row[i]) 
     i++ 
相關問題