我正在使用for循环的列表理解,但我正在寻找的是:从for循环得到两个列表。 示例(它显然不起作用,但我想要这样的东西):
def f(i): return i*i
def g(i): return 1.0/(1+i*i)
seq1, seq2=[(f(i),g(i))
for i in xrange(10)]
我正在寻找的结果必须是:
seq1= [f(0),f(1),..,f(9)]
seq2= [g(0),g(1),..,g(9)]
有可行的解决方案吗? 提前谢谢!
答案 0 :(得分:2)
是的,您的更新澄清(和简化)的事情 - 这是我在Python 2& 3:
try:
from itertools import izip
except ImportError: # Python 3
izip = zip
xrange = range
def f(i): return i*i
def g(i): return 1.0/(1+i*i)
seq1, seq2 = map(list, izip(*[(f(i), g(i)) for i in xrange(10)]))
print(' i ' + ' '.join(('{:5d}'.format(i) for i in xrange(10))))
print('seq1 = [' + ', '.join(('{:5d}'.format(v) for v in seq1)) + ']')
print('seq2 = [' + ', '.join(('{:.3f}'.format(v) for v in seq2)) + ']')
输出:
i 0 1 2 3 4 5 6 7 8 9
seq1 = [ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
seq2 = [1.000, 0.500, 0.200, 0.100, 0.059, 0.038, 0.027, 0.020, 0.015, 0.012]
答案 1 :(得分:0)
你想做的事情可以做,但它不是太透明......
在实践中,您创建一个元组列表,然后解压缩
使用zip(*
使用zip
返回元组,如果您绝对需要列表
跳过另一个箍......
>>> def f(i): return i*i
>>> def g(i): return 1.0/(1+i*i)
>>> t1, t2 = zip(*[(f(i),g(i+1)) for i in range(5)])
>>> l1, l2 = map(list, zip(*[(f(i),g(i+1)) for i in range(5)]))
>>> print t1, t2
(0, 1, 4, 9, 16) (0.5, 0.2, 0.1, 0.058823529411764705, 0.038461538461538464)
>>> print l1, l2
[0, 1, 4, 9, 16] [0.5, 0.2, 0.1, 0.058823529411764705, 0.038461538461538464]
>>>