创建新列表,其中包含列表x,但不包含列表y中与列表x相同的元素

2024-05-13 08:38:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道这个问题以前已经讨论过了,我知道这是一个新手和简单的问题,但出于某种原因,我不能把我的头围绕着代码,将需要这样做。下面是我需要的一个实际例子:

假设我有一个tumblr帐户,我跟踪5个人,其中3个人跟踪我。你知道吗

iFollow = [Tom, Richard, Bob, Samantha, Kat]
followsMe = [Samantha, Kat, Bob]

现在,我想放开我跟随的人,但是不要跟着我回去。 所以在这个例子中,我想把汤姆和理查德放在后面,因为即使我跟着他们,他们也不跟着我。我想创建一个列表:

unfollowThese = [Tom, Richard]

我一辈子都想不出怎么做。我知道有交集,找到共同的元素,这将输出“Bob”,似乎我想要相反的,我想要从我想要的新列表中删除两个列表中共同的元素。你知道吗

也就是说,我希望iFollow和followsMe中常见的元素从unfollowsethes中删除,因为我不想取消follow我的追随者。你知道吗

谢谢。你知道吗

另外,如果你能想出一个更好的标题,请改一下,我想不出什么叫它。。你知道吗


Tags: 代码richard元素列表tumblr帐户例子bob
3条回答
iFollow = ['Tom', 'Richard', 'Bob', 'Samantha', 'Kat']
followsMe = ['Samantha', 'Kat', 'Bob']


unfollowThese = [name for name in iFollow if name not in followsMe]

# returns: ['Tom', 'Richard']

最简单的方法是使用set difference

unfollowThese = set(iFollow).difference(followsMe)

如果followsMe很大的话,这应该比列表理解更快——它是线性平均时间复杂度,长度为followsMe的O(n),而不是两个长度都是线性的,所以O(n*k)。你知道吗

为了完整起见,请注意,您可以使用set来加快“order matters”版本的运行速度,以便将实时性也线性化:

followsMeSet = set(followsMe)
unfollowThese = [person for person in iFollow if person not in followsMeSet]

因为set成员资格测试是恒定的平均时间。你知道吗

如果顺序重要,则使用list comprehensions

unfollowThese = [ person for person in iFollow if person not in followsMe ]

如果项目顺序无关紧要,则使用^{}

import sets
s1 = sets.Set(iFollow)
unfollowThese = s1.difference(followsMe)

相关问题 更多 >