背景
该算法操纵金融分析。有多个相同大小的列表,它们被过滤到其他列表中进行分析。我对不同的平行列表做同样的过滤。我可以把它设置成a1,b1,c2作为一个元组出现在列表中,但是分析必须用另一种方式来划分元组来进行分析(一个列表对另一个列表的回归,beta等等)。在
我想做什么
我想根据第三个列表生成两个不同的列表:
>>> a = list(range(10))
>>> b = list(range(10,20))
>>> c = list(i & 1 for i in range(10))
>>>
>>> aprime = [a1 for a1, c1 in zip(a,c) if c1 == 0]
>>> bprime = [b1 for b1, c1 in zip(b,c) if c1 == 0]
>>> aprime
[0, 2, 4, 6, 8]
>>> bprime
[10, 12, 14, 16, 18]
似乎应该有一种pythonic/functional programming/itertools方法来创建两个列表并只在三个列表上迭代一次。比如:
^{pr2}$但这当然会产生语法错误。在
问题
有Python的方法吗?在
微优化射击
虽然丑陋,但是pythonic到max的一行程序将“just use a for loop”解决方案和我在曾经流行的timeitcage match中的原始代码边缘化了:
>>> import timeit
>>> timeit.timeit("z2(a,b,c)", "n=100;a = list(range(n)); b = list(range(10,10+n)); c = list(i & 1 for i in range(n));\ndef z2(a,b,c):\n\treturn zip(*[(a1,b1) for a1,b1,c1 in zip(a,b,c) if c1==0])\n")
26.977873025761482
>>> timeit.timeit("z2(a,b,c)", "n=100;a = list(range(n)); b = list(range(10,10+n)); c = list(i & 1 for i in range(n));\ndef z2(a,b,c):\n\taprime, bprime = [], [];\n\tfor a1, b1, c1 in zip(a, b, c):\n\t\tif c1 == 0:\n\t\t\taprime.append(a1); bprime.append(b1);\n\treturn aprime, bprime\n")
32.232914169258947
>>> timeit.timeit("z2(a,b,c)", "n=100;a = list(range(n)); b = list(range(10,10+n)); c = list(i & 1 for i in range(n));\ndef z2(a,b,c):\n\treturn [a1 for a1, c1 in zip(a,c) if c1 == 0], [b1 for b1, c1 in zip(b,c) if c1 == 0]\n")
32.37302275847901
如果你只想迭代一次,你就不可能用列表理解一次创建多个列表。在
您可以使用列表理解来创建元组列表,第一个元素属于一个列表,第二个元素属于另一个列表。但是如果你想把它们作为单独的列表,那么无论如何,你必须使用另一个操作来拆分它。在
这可能会赢得最丑代码奖,但它只适用于一行代码:
只需使用
for
循环:相关问题 更多 >
编程相关推荐