Python - 主要指定字符串的长度

时间:2012-02-28 10:43:22

标签: python string

我有一个程序返回一个数字结果的数字(目前为6),将它们转换为字符串,然后连接它们以便通过ZMQ发送。

示例输出是:

结果: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来获取我的个人结果。

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

感谢

2 个答案:

答案 0 :(得分:6)

以下是一些代码,展示了我在评论中推荐的方法。

这是您的程序的结果列表(如果它们没有列入列表,则将它们合并为一个):

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

现在我们使用map(str,nums)将每个数字转换为字符串,并通过调用字符串文字.join()的{​​{1}}方法将它们连接在一起,并将它们连接在一起:

','

调用>>> mystr = ','.join(map(str,nums)) >>> mystr '1,2,3,4,5,6' 表示“将函数map(str,nums)(将事物转换为字符串)应用于数组str的每个元素,并将结果存储在数组中。” nums是一种功能强大的函数式编程习惯用法,可用于大大缩短代码(参见Wikipedia)。

最后,只要出现逗号,就会在字符串上使用map方法将其拉开,并使用split将字符串转换回浮点数:

map(float,-)

答案 1 :(得分: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%)。

要从pickled对象中获取列表,您应该使用

l = cPickle.loads(s2)

希望它有所帮助。