在Python中有效地知道两个列表的交集是否为空
假设我有两个列表,L 和 M。现在我想知道它们是否共享一个元素。 哪一种是询问(在 python 中)它们是否共享元素的最快方法? 我不在乎他们共享哪些元素或有多少元素,只关心他们是否共享。
例如,在本例中
L = [1,2,3,4,5,6]
M = [8,9,10]
我应该得到 False,而这里:
L = [1,2,3,4,5,6]
M = [5,6,7]
我应该得到 True。
我希望问题很清楚。 谢谢!
曼努埃尔
Suppose I have two lists, L and M. Now I want to know if they share an element.
Which would be the fastest way of asking (in python) if they share an element?
I don't care which elements they share, or how many, just if they share or not.
For example, in this case
L = [1,2,3,4,5,6]
M = [8,9,10]
I should get False, and here:
L = [1,2,3,4,5,6]
M = [5,6,7]
I should get True.
I hope the question's clear.
Thanks!
Manuel
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
或者更简洁地说,
如果您确实需要
True
或False
运行一些计时后,这似乎也是一个不错的选择
如果 M 或 L 中的项目不可散列,您必须使用像这样效率较低的方法
以下是 100 个项目列表的一些计时。当没有交集时,使用集合要快得多,而当有相当大的交集时,使用集合会慢一些。
Or more concisely
If you really need
True
orFalse
After running some timings, this seems to be a good option to try too
If the items in M or L are not hashable you have to use a less efficient approach like this
Here are some timings for 100 item lists. Using sets is considerably faster when there is no intersection, and a bit slower when there is a considerable intersection.
为了避免构建交集的工作,并在我们知道它们相交时立即生成答案:
更新: gnibbler 尝试了这一点,发现使用 set() 代替 freezeset( )。你知道吗。
To avoid the work of constructing the intersection, and produce an answer as soon as we know that they intersect:
Update: gnibbler tried this out and found it to run faster with set() in place of frozenset(). Whaddayaknow.
首先,如果不需要排序,则切换到
set
类型。如果你仍然需要列表类型,那么这样做:0 == False
First of all, if you do not need them ordered, then switch to the
set
type.If you still need the list type, then do it this way: 0 == False
注意:这个答案似乎太复杂了,乍一看只需要一个集合操作,但集合只能包含可散列的项;原始问题没有指定列表中包含哪些项目。所以这段代码首先尝试使用集合,然后回退到更通用的代码。
这是我能想到的最通用、最有效的平衡方式(注释应该使代码易于理解):
HTH。
Note: this answer seems to be too-complicated for what at first glance needs to be only a set operation, but sets can contain only hashable items; the original question does not specify what items will be in the list. So this code first tries with sets and then falls back to more generic code.
That's the most generic and efficient in a balanced way I could come up with (comments should make the code easy to understand):
HTH.