如何跳过从 for 循环内部添加到列表的列表元素的循环?
How to skip looping over list elements added to the list from inside a for-loop?
我正在使用 for 循环遍历嵌套列表,如果满足条件,我想在下一个索引处插入一个新的嵌套列表。在下一次迭代中,应该跳过这些新添加的列表。示例:
input_lst = [["a", "b"], ["a", "d"], ["e", "f"]]
for sublst in input_lst:
if sublst[0] == "a":
new_sublst = []
input_lst.insert((input_lst.index(sublst) + 1), new_sublst)
new_sublst.insert(0, "a")
new_sublst.insert(1, "z")
print(input_lst)
预期结果:
[["a", "b"], ["a", "z"], ["a", "d"], ["a", "z"], ["e", "f"]]
实际结果 - 无限循环:
[["a", "b"], ["a", "z"], ["a", "z"], ["a", "z"], ["a", "z"] ...
您可以使用第二个列表:
input_lst = [["a", "b"], ["a", "d"], ["e", "f"]]
new_sublst = ["a", "z"]
output_lst = []
for sublst in input_lst:
output_lst.append(sublst)
if sublst[0] == "a":
output_lst.append(new_sublst)
输出:
[['a', 'b'], ['a', 'z'], ['a', 'd'], ['a', 'z'], ['e', 'f']]
试试这个:
input_lst = [["a", "b"], ["a", "d"], ["e", "f"]]
result = []
for sublst in input_lst:
result.append(sublst)
if sublst[0] == "a":
result.append(["a", "z"])
print(result)
或者:
input_lst = [["a", "b"], ["a", "d"], ["e", "f"]]
for sublst in input_lst:
if sublst == ["a","z"]:
continue
if sublst[0] == "a":
new_sublst = []
input_lst.insert((input_lst.index(sublst) + 1), new_sublst)
new_sublst.insert(0, "a")
new_sublst.insert(1, "z")
print(input_lst)
结果:
[['a', 'b'], ['a', 'z'], ['a', 'd'], ['a', 'z'], ['e', 'f']]
注意事项:
如果在当前子列表以“a”开头时将 ["a","z"] 添加为列表中的下一个元素,则创建了一个 endless-loop,因为下一次迭代是绝对以“a”开头,如 ["a", "z"].
使用一个新的列表来存储每次迭代的结果可以解决问题。或者,当当前子列表为 ["a","z"].
时,您可以跳过添加另一个 ["a","z"]
添加到针对特定条件进行测试的@ytung-dev 的答案中,我想出了一个解决方案,它使用第二个列表作为否定来进行比较。也许其他人会发现这很有用:
input_lst = [["a", "b"], ["a", "d"], ["e", "f"]]
input_lst_negative = []
for sublst in input_lst:
if (sublst[0] == "a") and (sublst not in input_lst_negative):
new_sublst = []
input_lst.insert((input_lst.index(sublst) + 1), new_sublst)
new_sublst.insert(0, "a")
new_sublst.insert(1, "z")
input_lst_negative.append(new_sublst)
print(input_lst)
输出:
[['a', 'b'], ['a', 'z'], ['a', 'd'], ['a', 'z'], ['e', 'f']]
我正在使用 for 循环遍历嵌套列表,如果满足条件,我想在下一个索引处插入一个新的嵌套列表。在下一次迭代中,应该跳过这些新添加的列表。示例:
input_lst = [["a", "b"], ["a", "d"], ["e", "f"]]
for sublst in input_lst:
if sublst[0] == "a":
new_sublst = []
input_lst.insert((input_lst.index(sublst) + 1), new_sublst)
new_sublst.insert(0, "a")
new_sublst.insert(1, "z")
print(input_lst)
预期结果:
[["a", "b"], ["a", "z"], ["a", "d"], ["a", "z"], ["e", "f"]]
实际结果 - 无限循环:
[["a", "b"], ["a", "z"], ["a", "z"], ["a", "z"], ["a", "z"] ...
您可以使用第二个列表:
input_lst = [["a", "b"], ["a", "d"], ["e", "f"]]
new_sublst = ["a", "z"]
output_lst = []
for sublst in input_lst:
output_lst.append(sublst)
if sublst[0] == "a":
output_lst.append(new_sublst)
输出:
[['a', 'b'], ['a', 'z'], ['a', 'd'], ['a', 'z'], ['e', 'f']]
试试这个:
input_lst = [["a", "b"], ["a", "d"], ["e", "f"]]
result = []
for sublst in input_lst:
result.append(sublst)
if sublst[0] == "a":
result.append(["a", "z"])
print(result)
或者:
input_lst = [["a", "b"], ["a", "d"], ["e", "f"]]
for sublst in input_lst:
if sublst == ["a","z"]:
continue
if sublst[0] == "a":
new_sublst = []
input_lst.insert((input_lst.index(sublst) + 1), new_sublst)
new_sublst.insert(0, "a")
new_sublst.insert(1, "z")
print(input_lst)
结果:
[['a', 'b'], ['a', 'z'], ['a', 'd'], ['a', 'z'], ['e', 'f']]
注意事项:
如果在当前子列表以“a”开头时将 ["a","z"] 添加为列表中的下一个元素,则创建了一个 endless-loop,因为下一次迭代是绝对以“a”开头,如 ["a", "z"].
使用一个新的列表来存储每次迭代的结果可以解决问题。或者,当当前子列表为 ["a","z"].
时,您可以跳过添加另一个 ["a","z"]
添加到针对特定条件进行测试的@ytung-dev 的答案中,我想出了一个解决方案,它使用第二个列表作为否定来进行比较。也许其他人会发现这很有用:
input_lst = [["a", "b"], ["a", "d"], ["e", "f"]]
input_lst_negative = []
for sublst in input_lst:
if (sublst[0] == "a") and (sublst not in input_lst_negative):
new_sublst = []
input_lst.insert((input_lst.index(sublst) + 1), new_sublst)
new_sublst.insert(0, "a")
new_sublst.insert(1, "z")
input_lst_negative.append(new_sublst)
print(input_lst)
输出:
[['a', 'b'], ['a', 'z'], ['a', 'd'], ['a', 'z'], ['e', 'f']]