将列表的第一个元素除以第二个,将第三个元素除以第四个,依此类推

时间:2014-12-15 17:22:29

标签: python python-3.x

目前,我有2个彼此分开的列表

a = [5,6,7,8]
b = [100,200,300,400]
output = [b/m for b,m in zip(a,b)]

但是由于我的数据库的性质,以不同的方式检索列表ab会更快:

data = [5,100,6,200,7,300,8,400]

列表中的第一个值是a中的第一个值,第二个值是b中的第一个值,第三个值是a中的第二个值,依此类推。< / p>

output = [5/100,6/200,7/300,8/400]

因此,我需要将第一个值除以第二个,将第三个值除以第四个,依此类推。现在这没问题,但我需要它尽可能快。有什么建议吗?

3 个答案:

答案 0 :(得分:5)

您可以使用切片:

output = [b / m for b, m in zip(data[::2], data[1::2])]

编辑3: 我们现在拥有的东西(len(data) = 8000):

  1. Jon Clements的iter解决方案,大约1ms
  2. 正常切片溶液,1.1ms
  3. range解决方案,2.5ms
  4. map解决方案(使用list实现)2.7ms

答案 1 :(得分:0)

>>> data = [5,100,6,200,7,300,8,400]
>>> [data[i]/float(data[i+1]) for i in range(0,len(data),2)]
[0.05, 0.03, 0.023333333333333334, 0.02]

for i in range(0,len(data),2)生成 0,2,4,6 。因此data[i]/data[i+1]给出了data[0]/data[1],...,data[6]/data[7]

答案 2 :(得分:0)

我更喜欢使用zip和map来做这种事情,以便可以在一行中完成:

map(lambda x : x[0]/x[1], zip(a,b))

zip是一个生成元组列表的函数,如下所示:

>>>>zip(a,b)
[(5, 100), (6, 200), (7, 300), (8, 400)]

map会返回一个新列表,将给定函数应用于整行。我看到其他人报告这需要几毫秒。将此问题应用于您的问题并使用IPython中上面给出的列表切片:

%timeit map(lambda x : x[0]/x[1], zip(data[::2], data[1::2]))
1000000 loops, best of 3: 1.33 µs per loop

编辑:len(数据)= 10000,我得到849微秒;有8000,我得到685微秒。