bounds = cursor.fetchone()
检索从SQL查询数据,我得到这样一个元组:
(34.2424, -64.2344, 76.3534, 45.2344)
,我会喜欢有一个像34.2424 -64.2344 76.3534 45.2344
是否有一个函数可以做到这一点?
bounds = cursor.fetchone()
检索从SQL查询数据,我得到这样一个元组:
(34.2424, -64.2344, 76.3534, 45.2344)
,我会喜欢有一个像34.2424 -64.2344 76.3534 45.2344
是否有一个函数可以做到这一点?
使用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))
这会比把周围括号慢列表理解,原因解释为here。
在你的(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
写入''[str(i)for i in a]',这意味着在''''.join()''必须工作之前首先创建一个列表对象。但是可以在''中写入''''.join(str(i)):在这种情况下,join()''获取每个'str(i)''在另一个之后由发生器''str(i)for i in a)''。另见我对海德罗的回答的评论。 – eyquem
@eyquem是的,这是正确的,谢谢你提及 –
其实列表理解与加入更好:http://stackoverflow.com/a/9061024/1240268 –
如果我有你的消息,你得到的元组,对吗?
如果是的话,下面的代码应该工作:
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)"
获取字符串,你首先应该摆脱unnescessary 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'
我建议你阅读我的评论Ronan的答案 – eyquem
您还可以使用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非常多样化。
你的解决方案比使用地图或列表理解更快,即:1.72每循环usec而不是1.87 –
你可以简单地使用下面的代码:
i = 0
for row in data:
print(row[i])
i++
在Python 3,你的答案是好的,因为''图()''是在Python 3而在Python2发电机,它会更好使用''imap()'' – eyquem
@eyquem我不认为性能是一个巨大的问题在这里:p – TerryA
@eyquem实际上它更快,更有效地使用list comp而不是生成器来进行连接:http:// stackoverflow.com/a/9061024/1240268 –