【问题标题】:iterate on two list of lists迭代两个列表列表
【发布时间】:2022-06-27 21:44:38
【问题描述】:

我正在使用 python 在 ETABS API 中开发代码。有一个用于绘制梁的命令。就像:

SapModel.FrameObj.AddByCoord(X1,Y1,Z1,X2,Y2,Z2,"name","section")

其中 X1,Y1,Z1 等是笛卡尔坐标系中的坐标。 我有两个列表列表,每个列表都是 X 和 Y 坐标。比如:

XCoordsList=[[0,5.5,11],[0,6,12.3],[0,7,12.5]]
YCoordsList=[[5,6.1,5.7],[10.5,12.1,12.7],[16,18,19]]

这些列表是对应的,也就是说某个点的X和Y是(XCoordList[0,0],YCoords[0,0]);(e.g.:(0,5),(5.5,6.1),( 11,5.7)) 我想迭代这两个列表并绘制我的梁。所以这就是我写的:

Z=3
for m,n in zip(XCoordsList,YCoordsList):
    SapModel.FrameObj.AddByCoord(m[m],n[n],Z,m[m+1],n[n+1],Z,"name","section")

结果是: TypeError:列表索引必须是整数或切片,而不是列表。 我该怎么办?

【问题讨论】:

  • 那是因为每个中的第一项是一个列表:[0,5.5,11](对于 X)您不能使用值 m 来获取列表中的内容,因为 m 是一个列表
  • @thatrandomperson 是的,我明白了。但是我该怎么做呢?

标签: python loops


【解决方案1】:

这种方法怎么样?

XCoordsList=[[0,5.5,11],[0,6,12.3],[0,7,12.5]]
YCoordsList=[[5,6.1,5.7],[10.5,12.1,12.7],[16,18,19]]
Coords = [
    (XCoordsList[array_idx][idx],YCoordsList[array_idx][idx]) 
    for array_idx in range(len(XCoordsList)) 
    for idx in range(len(XCoordsList[array_idx]))
]
print(Coords)

你得到:

[(0, 5), (5.5, 6.1), (11, 5.7), (0, 10.5), (6, 12.1), (12.3, 12.7), (0, 16), (7, 18), (12.5, 19)]

【讨论】:

    【解决方案2】:

    最好将它们配对成一个新结构,然后使用该结构。

    z = 3
    assert len(XCoordsList) == len(YCoordsList)
    obj_list = []
    for i in range(len(XCoordsList)):
        assert len(XCoordsList[i]) == len(YCoordsList[i])
        obj_list.extend((XCoordsList[i][j], YCoordsList[i][j], z XCoordsList[i][j+1], YCoordsList[i][j+1], z) for j in range(len(0, XCoordsList[i], 2)))
    

    现在,您有了一个可以轻松循环并以其他方式操作(删除单个点、将其分割成更小的部分等)的表示。

    for x1, y1, z1, x2, y2, z2 in obj_list:
        SapModel.FrameObj.AddByCoord(
            x1, y1, z1, x2, y2, z2, "name", "section")
    

    从您的问题中不清楚为什么您有嵌套列表;如果您想保留该结构,应该很容易了解如何更改代码以保留该结构。

    【讨论】:

      【解决方案3】:

      看看你的for循环里面到底发生了什么:

      XCoordsList=[[0,5.5,11],[0,6,12.3],[0,7,12.5]]
      YCoordsList=[[5,6.1,5.7],[10.5,12.1,12.7],[16,18,19]]
      
      Z=3
      for m,n in zip(XCoordsList,YCoordsList):
              print(f"m: {m}\nn: {n}")
              for i in range(3):
                      print(f"m[{i}], n[{i}]: {m[i]}, {n[i]}")
              print("----------------------------")
      

      这给出了:

      m: [0, 5.5, 11]
      n: [5, 6.1, 5.7]
      m[0], n[0]: 0, 5
      m[1], n[1]: 5.5, 6.1
      m[2], n[2]: 11, 5.7
      ----------------------------
      m: [0, 6, 12.3]
      n: [10.5, 12.1, 12.7]
      m[0], n[0]: 0, 10.5
      m[1], n[1]: 6, 12.1
      m[2], n[2]: 12.3, 12.7
      ----------------------------
      m: [0, 7, 12.5]
      n: [16, 18, 19]
      m[0], n[0]: 0, 16
      m[1], n[1]: 7, 18
      m[2], n[2]: 12.5, 19
      ----------------------------
      

      正如您所看到的m[m],n[n],Z,m[m+1],n[n+1],这不是要走的路:您是按列表本身编制索引,而解释器会告诉您。

      【讨论】: