【发布时间】:2022-01-07 14:47:53
【问题描述】:
我有一个函数,我想遍历列表列表。问题是,这个列表列表是动态的,这意味着它会根据用户输入而变化。
这是我的代码示例:
result = func(5)
for z in Z[0]:
result += func(z)
其中 Z 是列表的动态列表,而 func 是我的函数。该函数应遍历列表子集列表 Z[0] 中的每个元素并对结果求和。当列表列表如下所示时,该代码可以工作:
Z = [[1.1],[2.1],[3.1],[4.1]]
Z[0] 只是 [1.1]。然而,有时这个动态列表在每个列表中都有更多元素,在这种情况下,我需要遍历每个元素。如下:
Z = [list([1.1, 1.3]),list([3.1]),list([4]])
在这种情况下:
Z[0] = [list([1.1, 1.3])]
我的代码应该执行以下操作:
result = func(5)
for z in Z[0]:
result += func(z)
....
func(1.1) + func(1.3)
当我尝试使用列表列表运行代码时,出现错误:“只能将列表(而不是“浮点”)连接到列表中”
我确定这与尝试迭代列表有关。如果有人对此有简单的解决方法,或者知道我很想知道的问题。
编辑: 我想我真正的问题是这些动态列表是如何形成的,正如下面的答案所指出的那样,我将尝试进一步解释我的问题:
我在这里使用@Michael 给出的答案:Replacing certain elements of an array based on a given index
这是我用来生成列表列表的代码:
Arr1 = [9,7,3,1]
Arr2 = [[14,6],[13,2]]
Arr3 = [0,2]
Z = np.array([[Arr1[i]] if not np.sum(Arr3 == i) else Arr2[i] for i in np.arange(Arr1.size)], dtype=object)
Z = [[list([14, 6])], [list([7])], list[([13, 2])], list[([1])]]
子集 Z[0] 结果与
[list([14,6])]
当我尝试迭代时,它给了我错误(只能将列表(而不是“浮动”)连接到列表中)。
当条件 i = Arr3 不满足(比如 Arr3 为空)并且它只是恢复到原始数组时,此代码的输出给出:
Z = [[9][7][3][1]]
Z[0] = [9]
这样,迭代列表的代码就可以工作了。但是我也需要为上述工作。
如果我从这行代码中删除括号:
Z = np.array([[Arr1[i]] if not np.sum(Arr3 == i) else Arr2[i] for i in np.arange(Arr1.size)], dtype=object)
remove brackets around [Arr1[i]]
--->
Z = np.array([Arr1[i] if not np.sum(Arr3 == i) else Arr2[i] for i in np.arange(Arr1.size)], dtype=object)
然后
Z = [list([14,6]),list([7]),list([13,2]),list([1])]
and
z[0] = [14,6]
并且迭代列表的代码有效!但是,它不适用于条件 i = Arr 3 不满足的情况,因为输出看起来像
[9 7 3 1]
Z[0] = 9
我得到错误'float' object is not iterable。
对不起,这很多,但我认为它更好地解释了我的问题。我不确定是否在任何情况下都能正确生成列表。
【问题讨论】:
-
那么你只是想flatten 列表吗?
-
我想知道你的第二个列表。这真的是它的样子吗?因为那是列表列表的列表。真的是
[[1.1, 1.3], [3.1], [4]],还是里面有另一个嵌套层,比如[[[1.1,1.3]], [[3.1]], [[4]]]? -
@TimRoberts 是的,单词列表有第三个嵌套级别。它看起来像这样:[[list([elements])]]。我现在正在想办法摆脱这第三个巢穴。