【发布时间】:2021-05-18 07:43:25
【问题描述】:
我有这个清单:
ls = [[0, [1, 5], [], 'A'],
[1, [0, 2, 4], [], 'B'],
[2, [3, 1], [], 'X'],
[3, [2], [], 'C'],
[4, [1], [], 'D'],
[5, [0], [], 'E']]
我想遍历这个列表,从最后一项为“X”的行开始。在该行中,倒数第二项应为 0。之后,我想遍历同一行(第 3 行和第 1 行)第二列中显示的行,在这些行中,倒数第二项应为 1。然后我遍历第 0 行和第 4 行,倒数第二个项目应该是 2(此时无需遍历第 2 行,因为它已经被遍历了)。该迭代一直持续到整个倒数第二列被填满。所以输出应该是:
[[0, [1, 5], 2, 'A'],
[1, [0, 2, 4], 1, 'B'],
[2, [3, 1], 0, 'X'],
[3, [2], 1, 'C'],
[4, [1], 2, 'D'],
[5, [0], 3, 'E']]
我尝试过这样做:
def foo(data):
new_data = data
for subls in new_data:
if subls[3] == "X":
start = subls[1]
subls[2] = 0
num = 1
for num, item in enumerate(start):
new_data[item][2] = num
new_start = list(new_data[n][1] for n, i in enumerate(new_data))
start = new_start
num += 1
return new_data
f = foo(ls)
for a in f:
print(a)
但我只得到:
[0, [1, 5], [], 'A']
[1, [0, 2, 4], 1, 'B']
[2, [3, 1], 0, 'X']
[3, [2], 0, 'C']
[4, [1], [], 'D']
[5, [0], [], 'E']
我怎样才能做到这一点?
编辑@SaltySoda
起初这似乎可行,但当我尝试此列表时:
ls = [[0, [1, 7, 8, 9], [], 'E'],
[1, [0, 2, 10, 11], [], 'C'],
[2, [1, 3, 12, 13], [], 'C'],
[3, [2, 4, 14, 15], [], 'C'],
[4, [3, 5, 16, 17], [], 'C'],
[5, [4, 6, 18, 19], [], 'C'],
[6, [5, 20, 21, 22], [], 'E'],
[7, [0], [], '-'],
[8, [0], [], '-'],
[9, [0], [], '-'],
[10, [1], [], '-'],
[11, [1], [], '-'],
[12, [2], [], '-'],
[13, [2], [], '-'],
[14, [3], [], '-'],
[15, [3], [], '-'],
[16, [4], [], '-'],
[17, [4], [], '-'],
[18, [5], [], 'X'],
[19, [5], [], '-'],
[20, [6], [], '-'],
[21, [6], [], '-'],
[22, [6], [], '-']]
上面写着:
a[2] = a[2] - 1
TypeError: unsupported operand type(s) for -: 'list' and 'int'
您能否解释一下为什么会发生这种情况以及如何修复此错误?
【问题讨论】:
-
为什么我们需要从第三行开始。有什么具体原因吗?
-
@Roy 是的,我总是必须从最后一项为“X”的行开始。这是因为我想知道另一行有多少索引“远离”这一行。
-
是否只有一行将
X作为最后一项?最后肯定会有一排带“X”的吗? -
@Roy 是的,只有一行的最后一项是 X。