2013-07-02 97 views

回答

30

使用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)案例中,任何一个选项并不重要,因为在这里的表现看起来并不是什么大问题。但是,如果你曾经处理过浮点/整数的大元组,那么现在你知道如何使用以获得最大效率:)。

+0

在Python 3,你的答案是好的,因为''图()''是在Python 3而在Python2发电机,它会更好使用''imap()'' – eyquem

+0

@eyquem我不认为性能是一个巨大的问题在这里:p – TerryA

+1

@eyquem实际上它更快,更有效地使用list comp而不是生成器来进行连接:http:// stackoverflow.com/a/9061024/1240268 –

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

写入''[str(i)for i in a]',这意味着在''''.join()''必须工作之前首先创建一个列表对象。但是可以在''中写入''''.join(str(i)):在这种情况下,join()''获取每个'str(i)''在另一个之后由发生器''str(i)for i in a)''。另见我对海德罗的回答的评论。 – eyquem

+1

@eyquem是的,这是正确的,谢谢你提及 –

+0

其实列表理解与加入更好:http://stackoverflow.com/a/9061024/1240268 –

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)"获取字符串,你首先应该摆脱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' 
+0

我建议你阅读我的评论Ronan的答案 – eyquem

2

您还可以使用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非常多样化。

+0

你的解决方案比使用地图或列表理解更快,即:1.72每循环usec而不是1.87 –

-1

你可以简单地使用下面的代码:

i = 0 
for row in data: 
     print(row[i]) 
     i++ 
相关问题