【问题标题】:Why doesn't my loop work as a single line?为什么我的循环不能作为单行工作?
【发布时间】:2017-07-11 14:05:26
【问题描述】:

我对在 python 中使用嵌套单行 for 循环有疑问。特别是,我有以下几点:

A = [[tmp1[a][b] / tmp2[a] for b in range(0,10)] for a in range(0,20)]

根据Here,单行for循环等价于

for a in range(0,20):
    for b in range (0, 10):
        A.append(tmp1[a][b] / tmp2[a])

但是,python 给了我以下错误:

AttributeError: 'numpy.ndarray' 对象没有属性'append'。

我应该如何修改结构,以便使用双循环而不是单行嵌套循环?

更新:

A=[]
for a in range(0,20):
    B = []
    for b in range (0, 10):
        B.append(tmp1[a][b] / tmp2[a])
   A.append(B)

【问题讨论】:

  • 您没有正确初始化 A...您忘记了A = [] 部分。
  • 不是单行for循环;这是一个列表理解。他们都只是使用相同的关键字。
  • 追加用于原生list
  • 您混淆了两行非常相似的代码 - 第一行构建列表列表,第二行构建单个列表:A = [[tmp1[a][b] / tmp2[a] for b in range(0,10)] for a in range(0,20)]A = [tmp1[a][b] / tmp2[a] for b in range(0,10) for a in range(0,20)] 不同
  • @wrek :是的,你的更新是正确的

标签: python numpy


【解决方案1】:

有两种设置列表理解的方法

这个

A = [tmp1[a][b] / tmp2[a] for a in range(0,20) for b in range(0,10)]

生成一个平面列表。

这个:

B = [[tmp1[a][b] / tmp2[a] for b in range(0,10)] for a in range(0,20)]

产生一个嵌套列表。

请务必注意两个 for 语句之间的交换。在嵌套情况下,缓慢变化的变量在最后,在扁平情况下,它在前。

等价的循环是

A=[]
for a in range(0,20):
    for b in range (0, 10):
        A.append(tmp1[a][b] / tmp2[a])

B=[]
for a in range(0,20):
    inner=[]
    for b in range (0, 10):
        inner.append(tmp1[a][b] / tmp2[a])
    B.append(inner)

【讨论】:

    【解决方案2】:

    如果你这样做:

    for a in range(0,20):
        for b in range (0, 10):
            A.append(tmp1[a][b] / tmp2[a])
    

    A 应该是具有append 属性的列表:

    A=[]
    for a in range(0,20):
        for b in range (0, 10):
            A.append(tmp1[a][b] / tmp2[a])
    

    这个方法不同,它是list comprehension(一种创建列表的方法):

    A = [tmp1[a][b] / tmp2[a] for a in range(0,20) for b in range(0,10)]
    

    【讨论】:

    • 但我确实注意到了不同
    • 你有不同的结果?
    • 是的,我认为你应该去:
    • A=[] for a in range(0,20): B = [] for b in range (0, 10): B.append(tmp1[a][b] / tmp2[a]) A.append(B)
    • tmp1tmp2 来自哪里?
    猜你喜欢
    • 2015-04-24
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多