Python 如何将元组转换为不带逗号和括号的值字符串

Python 如何将元组转换为不带逗号和括号的值字符串,python,Python,我使用 bounds = cursor.fetchone() 我得到一个元组,比如: (34.2424, -64.2344, 76.3534, 45.2344) 我想要一个字符串,比如34.2424-64.2344 76.3534 45.2344 是否存在可以执行此操作的函数?使用: 您必须在此处使用map(它将元组中的所有项转换为字符串),否则将出现TypeError 关于函数的一点说明: map(str,(34.2424,-64.2344,76.3534,45.2344)相当于[str

我使用

bounds = cursor.fetchone()
我得到一个元组,比如:

(34.2424, -64.2344, 76.3534, 45.2344)
我想要一个字符串,比如
34.2424-64.2344 76.3534 45.2344

是否存在可以执行此操作的函数?

使用:

您必须在此处使用map(它将元组中的所有项转换为字符串),否则将出现
TypeError


关于函数的一点说明:

map(str,(34.2424,-64.2344,76.3534,45.2344)
相当于
[str(i)代表(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)))
''.join(str(i) for i in (34.2424, -64.2344, 76.3534, 45.2344))
它比使用
map()
要慢。区别在于
imap()
返回一个生成器,而
map()
返回一个列表(在python 3中,它返回一个生成器)

如果我要做:

' '.join(itertools.imap(str, (34.2424, -64.2344, 76.3534, 45.2344)))
''.join(str(i) for i in (34.2424, -64.2344, 76.3534, 45.2344))
由于所解释的原因,这比在清单上加括号要慢


在您(OP)的情况下,这两个选项都不重要,因为性能在这里似乎不是什么大问题。但是,如果您曾经处理过大量的浮点/整数元组,那么现在您就知道如何使用最大效率:)。

试试这个

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

如果我收到了你的信息,你会得到一组浮点数,对吗

如果是这样,则以下代码应起作用:

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'
我们在这里将元组中的每个值都转换为字符串,因为该方法只能处理字符串列表。 如果
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'
如果愿意使用
*
magic,还可以使用生成任意格式。使用单个分隔符处理此问题的具体情况实际上有点麻烦:

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

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

您可以简单地使用以下代码:

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

在Python3中,您的答案是好的,因为
map()
是Python3中的生成器。但是在Python2中,最好使用
imap()
@eyquem实际上,使用列表comp而不是生成器进行连接更快更有效:@AndyHayden哇,这很有趣。谢谢你的链接@非常感谢你的链接。Raymond Hettinger的回答以及Raymond和ovgolovin之间的讨论提供的信息非常有趣。-我在你的用户页面上推荐了两个最好的答案。我使用地图或列表理解的速度完全相同,即:1.87 usec/loopWriting
[str(I)for I in a]
,这意味着列表对象是在
''之前创建的。join()
必须工作。但是也可以编写
“”。join(str(i)表示a中的i)
:在这种情况下,
join()
获取每个
str(i)
,因为生成器
str(i)表示a中的i)
。另请参见我对海德罗答案的评论。事实上,加入后列表理解更好:谢谢安迪,谢谢你注意到,我大约两天前读过这个问题,但我已经知道我对这个话题有一些答案。我正在学习python,所以:)您的解决方案比使用映射或列表理解更快,即:每个循环1.72 usec,而不是1.87