Python 需要删除列表列表中的某些元素位置,有没有更有效的方法来实现这一点而不创建新的输出列表?

Python 需要删除列表列表中的某些元素位置,有没有更有效的方法来实现这一点而不创建新的输出列表?,python,python-3.x,list-manipulation,Python,Python 3.x,List Manipulation,我有一个名为candidate_keywords_的列表,其中包含三个字符串的内部列表。另一个名为positions_to_remove_的列表都有要删除的单词的索引位置。下面的代码通过创建一个新的输出列表来实现这一点。有没有不使用新列表的方法?如果我使用pop方法修改原始列表,每个pop都会影响其余元素的索引位置,它们不再匹配,并导致索引错误。请注意,位置的内部列表也可以为空 candidate_keywords_all =[ ['list1_word1', 'list1_word2'

我有一个名为candidate_keywords_的列表,其中包含三个字符串的内部列表。另一个名为positions_to_remove_的列表都有要删除的单词的索引位置。下面的代码通过创建一个新的输出列表来实现这一点。有没有不使用新列表的方法?如果我使用pop方法修改原始列表,每个pop都会影响其余元素的索引位置,它们不再匹配,并导致索引错误。请注意,位置的内部列表也可以为空

candidate_keywords_all =[
    ['list1_word1', 'list1_word2', 'list1_word3'],
    ['list2_word1', 'list2_word2', 'list2_word3', 'list2_word4', 'list2_word5', 'list2_word6'],
    ['list3_word1', 'list3_word2']
]

positions_to_remove_all =[ [0, 2], [1, 3, 5], [] ]

## extract the Selected keywords into new data structure
final_keywords = []
for each_index_positions, each_candidate_keywords in \
    zip(positions_to_remove_all, candidate_keywords_all):
    temp_arr = [keyword for idx, keyword in enumerate(each_candidate_keywords) if idx not in each_index_positions]
    final_keywords.append(temp_arr)

for each_candidate_keywords, each_index_positions, each_final_keywords in zip(candidate_keywords_all, positions_to_remove_all, final_keywords):
    print(f"BEFORE = {each_candidate_keywords}\nRemove positions = {each_index_positions}\nAFTER = {each_final_keywords}\n\n")
非常感谢您的任何输入。

您可以使用del直接从列表中按索引就地删除元素。 注意,我以相反的顺序迭代位置,否则在删除剩余索引后,所有位置都会改变

对于每个索引位置,每个候选关键字 位置到移除所有,候选关键字所有 : 对于反向每个索引位置的位置: 删除每个候选关键字[pos] 您可以使用del就地直接从列表中按索引删除元素。 注意,我以相反的顺序迭代位置,否则在删除剩余索引后,所有位置都会改变

对于每个索引位置,每个候选关键字 位置到移除所有,候选关键字所有 : 对于反向每个索引位置的位置: 删除每个候选关键字[pos]
在所有场景中,您都必须遍历列表。因此,您在这里无法获得任何性能,但如果您关心行数,您可以使用单一列表理解来编写:

final_keywords = [[item for j, item in enumerate(sublist) if j not in positions_to_remove_all[i]]
                  for i, sublist in enumerate(candidate_keywords_all)]

在所有场景中,您都必须遍历列表。因此,您在这里无法获得任何性能,但如果您关心行数,您可以使用单一列表理解来编写:

final_keywords = [[item for j, item in enumerate(sublist) if j not in positions_to_remove_all[i]]
                  for i, sublist in enumerate(candidate_keywords_all)]

我希望您知道,每次弹出元素列表时都会重新编制索引,这是非常昂贵的。这就是为什么我建议创建一个新的列表,而不是从现有列表中删除元素。是的,pop或del同意这样做,这对我来说没问题。实际上,列表中有相当多的数据。这是数据的简化版本。我希望您知道,每次弹出元素列表时都会重新编制索引,这是非常昂贵的。这就是为什么我建议创建一个新的列表,而不是从现有列表中删除元素。是的,pop或del同意这样做,这对我来说没问题。实际上,列表中有相当多的数据。这是数据的简化版本。优雅的解决方案,谢谢!但愿我自己能想到:优雅的解决方案,谢谢!但愿我自己也能想到:谢谢你的回答。但双重列表理解并不是主要关注点。在不创建新数据结构的情况下执行此操作非常困难@Adam.Er8解决方案非常适合,即使列表反转可能会花费一些时间。谢谢您的回答。但双重列表理解并不是主要关注点。在不创建新数据结构的情况下执行此操作非常困难@Adam.Er8解决方案非常适合,即使列表反转可能会花费一些时间。