【问题标题】:Better way to do multiple list comprehensions over the same range?在同一范围内进行多个列表推导的更好方法?
【发布时间】:2012-07-17 07:59:56
【问题描述】:

目前我的代码如下

A = [matrix_x[i][:n] for i in xrange(0, n)]
B = [matrix_x[i][n:] for i in xrange(0, n)]
C = [matrix_x[i+n][:n] for i in xrange(0, n)]
D = [matrix_x[i+n][n:] for i in xrange(0, n)]

有没有更好的方法来做到这一点,因为我不断地在同一个 xrange 上循环。在这种情况下,最好不要使用列表推导,而是在单个 for 循环中将值附加到每个列表。

A,B,C,D = [],[],[],[]
for i in xrange(0,n):
    A.append(matrix_x[i][:n])
    B.append(matrix_x[i][n:])
    ... etc

第二种方式对我来说似乎更有效。什么方式会更“pythonic”,或者还有其他我没有想到的方式

【问题讨论】:

  • 我认为解释器足够聪明,可以优化这个例子。你应该试着计时。
  • 对于使用矩阵,您是否考虑过 numpy?
  • @Mark - 我有,但在这种情况下我想这样做

标签: python list-comprehension


【解决方案1】:

不是真的。您可以创造性地使用 zip() 一次生成所有 4 个列表,但我非常很难将其称为“更好”。

【讨论】:

    【解决方案2】:

    我通常更喜欢遍历项目列表本身,而不是遍历 xrange(len(list_of_items)) 并一次处理第 i 个项目。以下是如何使用 zip 按顺序查看每个 (this,next) 对,然后构建您的列表:

    A,B,C,D = [],[],[],[]
    for this_,next_ in zip(matrix_x,matrix_x[1:]):
        A.append(this_[:n])
        B.append(this_[n:])
        C.append(next_[:n])
        D.append(next_[n:])
    

    是的,您真的可以将其压缩为 zipzip

    A,B,C,D = zip(*((this_[:n],this_[n:],next_[:n],next_[n:])
                      for this_,next_ in zip(matrix_x,matrix_x[1:])))
    

    【讨论】:

      【解决方案3】:
      result = [(matrix_x[i][:n], matrix_x[i][n:], matrix_x[i+n][:n],matrix_x[i+n][n:])  for i in xrange(0, n)]
      

      那么你必须为每个元素解包 A,B,C,D = 结果[x]

      虽然将 matrix_x 作为字符串这样做并没有产生预期的结果。

      【讨论】:

        猜你喜欢
        • 2012-02-22
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        • 2021-12-12
        • 1970-01-01
        • 1970-01-01
        • 2016-07-03
        • 1970-01-01
        相关资源
        最近更新 更多