Как преобразовать кортеж в строку значений без запятой и круглых скобок - программирование

Как преобразовать кортеж в строку значений без запятой и круглых скобок

Я получил данные из SQL-запроса с помощью

bounds = cursor.fetchone()

И я получаю кортеж вроде:

(34.2424, -64.2344, 76.3534, 45.2344)

И я хотел бы иметь строку типа 34.2424 -64.2344 76.3534 45.2344

Существует ли функция, которая может это сделать?

4b9b3361

Ответ 1

Используйте 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))

Это будет медленнее, чем положить скобки вокруг понимания списка, из-за причин, объясненных здесь.


В вашем (OP) случае любая опция не имеет большого значения, так как производительность здесь не выглядит огромной. Но если вы когда-либо имеете дело с большими кортежами float/integers, то теперь вы знаете, что использовать для максимальной эффективности:).

Ответ 2

Если у меня есть ваше сообщение, вы получаете кортеж поплавков, я прав?

Если это так, то следующий код должен работать:

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)", вы должны сначала избавиться от ненужных 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'

Ответ 3

Вы также можете использовать 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 |

Здесь параметры вашей строки очень разнообразны.

Ответ 4

Попробуйте это

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

Ответ 5

Вы можете просто использовать следующий код:

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