如何在不使用逗号和括号的情况下将元组转换为值字符串

时间:2013-07-02 13:02:52

标签: python

我使用

从sql查询中检索数据
bounds = cursor.fetchone()

我得到了一个像元组一样的元组:

(34.2424, -64.2344, 76.3534, 45.2344)

我希望有一个像34.2424 -64.2344 76.3534 45.2344

这样的字符串

是否存在能够做到这一点的功能?

5 个答案:

答案 0 :(得分:32)

使用str.join()

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

你必须在这里使用map(将元组中的所有项目转换为字符串),否则你将获得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)案例中,任何一个选项并不重要,因为这里的表现看起来不是很重要。但是如果你曾经处理大型浮点数/整数元组,那么现在你知道如何使用它来获得最大效率:)。

答案 1 :(得分: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)"的字符串,您应首先摆脱不必要的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'

答案 2 :(得分: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 |

从这里开始,你的字符串formatting options非常多样化。

答案 3 :(得分: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

答案 4 :(得分:-1)

您只需使用以下代码:

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