【发布时间】:2021-04-28 14:10:27
【问题描述】:
我有 2 个列表。其中之一是列表列表。更具体地说:
lst1 = [[4, 5, 6], [19, 20, 24, 25]]
lst2 = [8, 21]
每个列表列表的数字代表索引。
我想要做的是从lst2 中删除任何元素
这不在lst1 中每个列表的索引之间。
例如,lst2 中的数字 8 应该被删除,因为它不在 lst1 的两个列表(元素)的第一个和最后一个数字之间。不应删除数字 21,因为它位于 lst2 的第二个列表(元素)的第一个和最后一个元素之间。
目前我写的代码是:
for elem2 in lst2:
count = 0
for elem1 in lst1:
minsubelem = min(elem1)
maxsubelem = max(elem1)
condition = not ((elem2 > minsubelem) and (elem2 < maxsubelem))
if condition:
count += 1
if count == len(lst1):
index = lst2.index(elem2)
lst2.pop(index)
print(lst2)
返回:
[21]
这可行,但正如您可以想象的那样,使用 2 个 for 循环并不是最优的,如果列表很长,计算时间可能会显着增加。
为了提高效率,该代码的潜在替代品是什么?
说明:
-
lst2中的索引 永远不等于 中的任何索引lst1。 - 我已经阅读了itertools 文档,但我可能是 缺乏将建议的方法与我的用例联系起来的经验。
【问题讨论】:
-
问题不在于这两个循环;您将 必须 遍历这两个列表以获取您需要的信息。一个问题是您对
lst1的迭代次数与lst2中的元素一样多。想想你如何只能迭代lst1一次。 -
一个轻微的优化是,如果您找到包含
elem2的最小值和最大值,那么您可以退出内部循环,因为您知道不必从lst2中删除elem2。此外,您不应在迭代lst2时对其进行修改。也许最好列出所有幸存元素的新列表。 -
@Ben 这是我想的一部分:)。我想也许我可以使用集合,但在 lst1 的列表元素和 lst2 的元素之间永远不会出现相同的数字。我正在阅读 itertools 文档,因为不知何故我怀疑应该有一些功能可以帮助这个用例,但我还不能链接它。
-
@quamrana 这就是为什么我使用 count 变量来确保在检查 lst1 中所有列表的条件后删除数字。实际上我将幸存者保存在一个新列表中,但理想情况下我想避免分配/创建一个新列表。
-
这就是我的意思:您总是在检查所有列表的条件。有时您不必检查所有列表。一旦找到保留元素的原因,就可以保存它,您可以跳过检查其他列表。