(list comprehension)使用for循环获取多个列表

时间:2014-12-15 17:59:54

标签: python list-comprehension

我正在使用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)]

有可行的解决方案吗? 提前谢谢!

2 个答案:

答案 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]
>>>