将所有列表放在一个循环中,而不是使用分隔列表的两个循环



我有一个算法问题。如果你觉得这很傻,我很抱歉。

考虑我有两个列表:

list_a = ["Red", "Blue", "Black"]
list_b = ["Samsung", "Apple"]

所以问题是,如果我用两个for循环遍历上面的列表是更快还是合并它们并只使用一个?

假设目标只是迭代两个集合中的元素(而不是生成和迭代某种笛卡尔积),如果我们谈论的是Big-O符号,那么从算法的角度来看,这无关紧要-两个集合都需要O(m+n)(其中m和n分别是list_alist_b的长度)操作。实际的速度将是具体实现的,例如,如果你做像list_a.extend(list_b)这样的事情,然后迭代-那么由于需要移动元素(为了简单,我们可以认为它是O(n)),它将会变慢,但是如果你将使用一些懒惰的可迭代方法(例如@Jorge Luis提到的itertools.chain),那么速度应该是可比的。

在某些情况下,你可以"reduce"通过在一个循环中迭代min(m, n)个元素,然后在单独的循环中完成较长的循环(伪代码以了解其含义),将Big-O转换为O(max(m, n)):

longest = list_a if len(list_a) > len(list_b) else list_b
for i in range(min(len(list_a), len(list_b))):
print(list_a[i])
print(list_b[i])
for j in range(i+1, max(len(list_a), len(list_b))):
print(longest[j])

这类似于itertools.zip_longest所做的(正如@chepner正确提到的)

我认为这取决于你想通过迭代完成什么。

如果需要对list_a和list_b元素的每个组合执行操作,例如创建笛卡尔积或嵌套循环,则必须使用两个for循环。在这种情况下,合并列表是没有用的,甚至可能导致代码出错。

但是,如果您只需要按顺序遍历两个列表中的所有元素,那么将它们合并到一个列表中并使用单个for循环将更快,更有效。

最新更新