Как преобразовать кортеж в строку значений без запятой и круглых скобок
Я получил данные из SQL-запроса с помощью
bounds = cursor.fetchone()
И я получаю кортеж вроде:
(34.2424, -64.2344, 76.3534, 45.2344)
И я хотел бы иметь строку типа 34.2424 -64.2344 76.3534 45.2344
Существует ли функция, которая может это сделать?
Ответы
Ответ 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++