2013-07-02 10 views

risposta

30

Uso str.join():

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

Dovrete usare mappa qui (che converte tutti gli elementi nella tupla di stringhe) perché altrimenti si otterrà un TypeError.


Un po 'di chiarezza sulla funzione map():

map(str, (34.2424, -64.2344, 76.3534, 45.2344) è equivalente a [str(i) for i in (34.2424, -64.2344, 76.3534, 45.2344)].

E 'un pochino più veloce rispetto all'utilizzo di una lista di comprensione:

$ 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 

Come mostrato nei commenti a questa risposta, str.join() può prendere un generatore invece di una lista. Normalmente, questo sarebbe più veloce, ma in questo caso, è più lento.

Se dovessi fare:

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

Sarebbe più lento rispetto all'utilizzo di map(). La differenza è che imap() restituisce un generatore, mentre map() restituisce una lista (in python 3 restituisce un generatore)

Se dovessi fare:

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

Sarebbe più lento di mettere tra parentesi intorno alla elencare la comprensione, per motivi spiegati here.


Nel tuo caso (OP), nessuna delle due opzioni è davvero importante, in quanto le prestazioni non sembrano un grosso problema qui. Ma se hai a che fare con grandi tuple di float/interi, ora sai cosa usare per la massima efficienza :).

+0

In Python 3, la risposta è buona, perché '' map() '' è un generatore in Python 3. Ma in python2, sarebbe meglio usa '' imap() '' – eyquem

+0

@eyquem Non penso che le prestazioni siano un problema enorme qui: p – TerryA

+1

@eyquem in realtà è più veloce e più efficiente usare un comp elenco piuttosto che un generatore per un join: http: // stackoverflow.com/a/9061024/1240268 –

1

Prova questa tupla

>>> 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

Scrivere '' [str (i) per i in a] '', significa che prima viene creato un oggetto lista prima di '' '' .join() '' deve funzionare. Ma è possibile scrivere '' '' .join (str (i) per i in a) '': in questo caso, '' join() '' ottiene ogni '' str (i) '' come vengono forniti uno dopo l'altro dal generatore '' str (i) per i in a) ''. Vedi anche il mio commento alla risposta di Haidro. – eyquem

+1

Sì, è corretto, grazie per aver menzionato –

+0

In realtà la list comprehension è migliore con join: http://stackoverflow.com/a/9061024/1240268 –

4

Se ho ricevuto il tuo messaggio, si stanno ottenendo dei carri allegorici, ho ragione?

Se è così, il seguente codice dovrebbe funzionare:

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' 

stiamo convertendo ogni valore in tuple a stringa qui, perché str.join metodo può funzionare solo con le liste di corda. Se t è una tupla di stringhe, il codice sarà solo ' '.join(t).

Nel caso in cui stai ricevendo stringa in formato "(34.2424 , -64.2344 , 76.3534 , 45.2344)", si dovrebbe innanzitutto sbarazzarsi di parthensis unnescessary e virgole:

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

Ti suggerisco di leggere il mio commento alla risposta di Ronan – eyquem

2

È inoltre possibile utilizzare str.format() per la produzione di qualsiasi formattazione arbitraria, se siete disposti a usare * magia. Per gestire il caso specifico di questa domanda, con un unico separatore, è in realtà un po 'ingombrante:

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

34.2424 -64.2344 76.3534 45.2344 

Una versione più robusta che gestisce qualsiasi lunghezza, come join, è:

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

Ma la il valore aggiunto è che, se si desidera estendere la formattazione a qualcosa di più coinvolti hai l'opzione:

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

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

da qui, la stringa formatting options sono molto diversi.

+0

La soluzione è più veloce che usare la mappa o la comprensione delle liste, ovvero: 1,72 usec per ciclo invece di 1,87 –

-1

si può semplicemente utilizzare il seguente codice:

i = 0 
for row in data: 
     print(row[i]) 
     i++ 
Problemi correlati