2012-02-28 78 views
1

我有一个程序返回数字结果的数字(6,此刻),将它们转换为字符串,然后连接它们以通过ZMQ发送。Python - 指定字符串的长度,主要是

实施例输出有:

结果:7.85,-5.75,16.0,0.0,0.84375,0.828125

7.85-5.7516.00.00.843750.828125 

结果:5.25,-10.72,8.5,0.0,0.752,0.8265

5.25-10.728.50.00.7520.8265 

在通过ZMQ接收到此字符串后,我需要再次将其拆分。

为了使这项工作,我认为指定字符串的长度是最简单的方法,所以我总是知道每个答案我会有x个字符,然后我可以在最后使用stringsplit来获得我的个别结果。

问题是我无法找到如何做到这一点。我知道如何指定小数位的数量,但是当我有单/双位数整数,有时用 - 标志,我有点卡住...

感谢

+5

我认为最简单的做法是使用'','。join()'连接数字和逗号,然后在另一端使用'str.split(',')' – 2012-02-28 10:45:20

+0

...什么是ZMQ? – 2012-02-28 11:10:07

+0

http://www.zeromq.org/ – 2012-02-28 11:11:18

回答

2

我看到你正在使用ZMQ和这就是为什么我想你想要更好的表现。如果是这样,尝试使用cPickle模块(它在标准Python库中可用)来打包此列表,而不是将其转换为字符串。

这里是比较的两种方式效率的代码:

import time 
import cPickle 
import random 

random.seed() 
l = [ random.random()*1000 for i in xrange(100000) ] 

t0 = time.time() 
s1 = ','.join(map(str,l)) 
t1 = time.time() - t0 

t0 = time.time() 
s2 = cPickle.dumps(l, -1) 
t2 = time.time() - t0 

print 's1: len1=%s t1=%s' % (len(s1), t1) 
print 's2: len2=%s t2=%s' % (len(s2), t2) 
print 's2/s1: len2/len1=%s t2/t1=%s' % (float(len(s2))/len(s1), t2/t1) 

,它的输出:

s1: len1=1389129 t1=0.281008005142 
s2: len2=900206 t2=0.0193469524384 
s2/s1: len2/len1=0.648036287487 t2/t1=0.0688484031925 

你可以看到,cPickle的方法是(更快x14.5倍)要快得多,在您必须传输的数据大小方面效率很高(64%)。

为了得到从腌制对象列表中,你应该使用

l = cPickle.loads(s2) 

希望它能帮助。

6

下面是一些代码演示方法我在我的评论中建议。

这是从你的程序结果列表中(如果他们没有在列表中已经来了,把它们放到一个):

>>> nums = [1,2,3,4,5,6] 

现在我们用map(str,nums)到每个号码转换为串,并连同它们之间的逗号通过调用字符串字面','.join()方法加入他们的行列:

>>> mystr = ','.join(map(str,nums)) 
>>> mystr 
'1,2,3,4,5,6' 

呼叫map(str,nums)的意思是“应用功能str(其转化东西到字符串)到数组nums的每个元素并将结果存储在一个数组中。“ map是一个功能强大的编程习惯用法,可用于大幅缩短代码(请参见Wikipedia)。

最后,你用你的字符串split方法,每当一个逗号似乎把它拆开,并使用map(float,-)到字符串转换回浮点数:

>>> map(float,mystr.split(',')) 
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0] 
+0

伟大的想法,和精美的作品。谢谢 – sambasam 2012-02-28 11:01:01

+0

map(float,mystr.split(','))的替代方法是mystr.split(',')]中的x [float(x))。 – Pierce 2012-02-28 11:40:01