2013-07-02 16 views

Odpowiedz

30

Zastosowanie str.join():

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

Będziesz musiał użyć mapy tutaj (który konwertuje wszystkie elementy w krotce do strun), ponieważ w przeciwnym razie dostaniesz TypeError.


Nieco klarowania na map() funkcję:

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

To odrobinę szybciej niż przy użyciu wyrażeń listowych:

$ 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 

Jak przedstawiono w komentarzach do tej odpowiedzi, str.join() może generator zamiast listy. Zwykle byłoby to szybsze, ale w tym przypadku jest to wolniejsze.

Gdybym miał zrobić:

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

byłoby wolniejsze niż przy użyciu map(). Różnica polega na tym, że imap() zwraca generator, natomiast map() zwraca listę (w Pythonie 3 zwraca generator)

Gdybym miał zrobić:

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

Byłoby wolniej niż wprowadzenie nawiasów wokół lista ze zrozumieniem, z powodów wyjaśnionych here.


W przypadku (OP) żadna z opcji nie ma większego znaczenia, ponieważ wydajność nie wydaje się tu zbyt duża. Ale jeśli kiedykolwiek masz do czynienia z dużymi krotkami liczby/liczb całkowitych, to teraz wiesz, co możesz użyć dla maksymalnej wydajności :).

+0

W Pythonie 3, odpowiedź brzmi dobrze, bo 'mapie()' 'jest generator w Pythonie 3. Ale w python2, byłoby lepiej użyj '' imap() '' – eyquem

+0

@eyquem Wydaje mi się, że wydajność nie jest tutaj ogromnym problemem: p – TerryA

+1

@eyquem faktycznie jest szybsze i bardziej wydajne korzystanie z kompilatora listy zamiast generatora dla złączenia: http: // stackoverflow.com/a/9061024/1240268 –

1

Spróbuj

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

Zapisywanie '' [str (i) dla i w a] '', oznacza, że ​​obiekt listy jest najpierw tworzony zanim '' '.sin() '' musi działać. Ale możliwe jest napisanie '. '' .join (str (i) dla i w a)' ': w tym przypadku' 'join()' 'dostaje wszystkie' 'str (i)' 'ponieważ są one umeblowane po drugim przez generator '' str (i) dla i w a) ''. Zobacz także mój komentarz do odpowiedzi Haidro. – eyquem

+1

@eyquem Tak, to prawda, dziękuję za wzmiankę o –

+0

Rzeczywiście, zrozumienie listy jest lepsze z dołączeniem: http://stackoverflow.com/a/9061024/1240268 –

4

Jeśli mam wiadomość, dostajesz krotki pływaków, mam rację?

Jeśli tak, poniższy kod powinien działać:

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' 

Jesteśmy konwersji każdą wartość w krotce ciąg tutaj, ponieważ str.join metoda może pracować tylko z listami ciąg. Jeśli t jest krotką łańcuchów, kod będzie po prostu ' '.join(t).

W przypadku dostajesz ciąg w formacie "(34.2424 , -64.2344 , 76.3534 , 45.2344)", należy najpierw pozbyć unnescessary parthensis i przecinkami:

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

Proponuję przeczytać mój komentarz do odpowiedzi Ronana – eyquem

2

Można również wykorzystać str.format() produkować dowolną formatowania jeśli jesteś gotów użyć * magia. Obsługiwać konkretny przypadek to pytanie, z jednym separatorem, w rzeczywistości jest trochę uciążliwe:

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

34.2424 -64.2344 76.3534 45.2344 

bardziej wytrzymała wersja, która obsługuje dowolną długość, jak join jest:

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

Ale wartość dodana jest to, że jeśli chcesz przedłużyć swój formatowanie na coś bardziej zaangażowanego masz opcję:

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

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

stąd ciąg formatting options są bardzo zróżnicowane.

+0

Rozwiązanie jest szybsze niż przy użyciu mapy lub rozumienia list, tj .: 1.72 użycie pętli zamiast 1.87 –

-1

Mogłeś po prostu użyć następującego kodu:

i = 0 
for row in data: 
     print(row[i]) 
     i++ 
Powiązane problemy