给定两个长度相同的列表,如何有效地找到这些列表中对应元素不相等的第一个位置?基本上我需要索引或两个不相等的元素。
我感兴趣是否存在一些简洁的“pythonic”解决方案,而无需对列表进行明显的显式迭代。
你无法避免对列表的迭代,但你可以通过理解来做到这一点并获得一个优雅的解决方案:
next( (idx, x, y) for idx, (x, y) in enumerate(zip(list1, list2)) if x!=y )
Run Code Online (Sandbox Code Playgroud)
如果你不喜欢以一行为中心的东西,你可以像这样分割它
coupled_idx = enumerate(zip(list1, list2))
res = next( idx for idx, (x, y) in coupled_idx if x!=y )
Run Code Online (Sandbox Code Playgroud)
编辑:
另外,如果您需要检查两个列表是否完全相等,您可以向 next 函数添加第二个参数,告诉它如果没有找到索引则返回什么。最常见的选项是返回 None:
coupled_idx = enumerate(zip(list1, list2))
res = next( (idx for idx, (x, y) in coupled_idx if x!=y), None )
Run Code Online (Sandbox Code Playgroud)
请注意,您需要将生成器表达式括在括号之间,因为它不是此调用中函数的唯一参数。
为了增加一点乐趣,您还可以通过链接表达式来询问第 n 个不同的情侣。例如,这将为您提供直到第五对的所有情侣(如果缺少这对情侣,则填充“无”)
coupled_idx = enumerate(zip(list1, list2))
coupler = (idx for idx, (x, y) in coupled_idx if x!=y)
res = [ next(coupler, None) for _ in range(5) ]
Run Code Online (Sandbox Code Playgroud)
编辑2:
这种解决方案实际上通过 zip 函数创建两个列表的副本。如果您需要避免这种情况,可以使用itertools 模块中的izip函数。
关于有趣的部分,您可以通过同一模块中的islice函数仅选择某些解决方案