【问题标题】:(list comprehension) getting more than one list with a for loop(列表理解)使用 for 循环获取多个列表
【发布时间】:2014-12-15 17:59:53
【问题描述】:

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

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

【问题讨论】:

  • 对于这样的事情不要试图聪明,除非它需要做两个循环。它会更容易阅读和维护。列表推导应该是简单的单行。
  • @Dan:一般我同意,这可能是过早优化的情况——the root of all evil——但我的答案中使用的zip(*zip(...))docs 中作为示例显示,所以我怀疑这是 OP 应该学习的 Python 习语。

标签: python list-comprehension


【解决方案1】:

是的,您的更新澄清(并简化)了一些事情 - 这是我为在 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]

【讨论】:

  • 好的,我想我必须更好地提出我的问题。假设我有两个以 i 作为参数 ex 的函数,而不是 c[i]+1 和 b[i]+2。 f(i) 和 g(i) 并且它们独立于 c 和 b。所以要有这样的东西: seq1, seq2=[(f(i),g(i)) for i in xrange(c.shape[0])]
  • 这个答案同样适合您 - 只需为您的函数调用替换“i+ 1”和“j + 2”表达式即可。
  • mimou:不知道xrange(c.shape[0]) 是什么意思。请使用附加信息更新您的问题 - 通常将一堆代码放在评论中并不是一个好主意。
  • martineau:很抱歉造成混乱。我希望在我上次更新后更清楚!
【解决方案2】:

你想做的可以做,但又不是太透明……

在实践中,您创建一个元组列表,然后解压缩 使用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]
>>> 

【讨论】:

  • e 没有被使用时,为什么要for i, e in enumerate('asdef') 而不是for i in range(len('asdef'))
  • 完全没有理由,我接受你的建议并编辑我的答案
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2011-04-07
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多