2012-03-27 136 views
1

我知道这个问题之前已经讨论过了,我知道这是一个新手和简单的问题,但由于某种原因我无法将自己的头围绕需要执行此操作的代码。这里有一个实际的例子,我需要这个:创建包含列表x但列表y中包含列表x但不包含与列表x中元素相同的列表的新列表-python

可以说我包含一个tumblr帐户,我跟随5人,其中3人跟着我回来。

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

现在,我想取消关注,我关注的人,但不要跟我回去。 因此,在这个例子中,我想要取消关注汤姆理查德,因为即使我遵循他们,他们不会跟着我。我想创建一个列表:

unfollowThese = [Tom, Richard] 

我不能为我的生活弄清楚如何做到这一点。我知道存在相交,找到共同元素,会输出“Bob”,看起来像我想要的是相反的,我希望两个列表中通用的元素都从我想要创建的新列表中删除。

I.E.我希望iFollow中的常用元素和followMe从unfollow中移除,因为我不想取消关注我的追随者。

谢谢。

p.s.如果你能想到更好的标题,请改变它,我想不出什么来调用它..

回答

4

使用list comprehensions如果为了事项:

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

使用sets如果项目的顺序并不重要:

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

需求只是其中之一转换为'set' - 转换两者的唯一优点是可以编写d推断为's1 - s2'。 – agf 2012-03-27 11:03:43

+0

真的!谢谢 :) – 2012-03-27 11:09:41

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


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

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

最简单的方法是使用set difference

unfollowThese = set(iFollow).difference(followsMe) 

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

只要是完整的,请注意,您可以使用set加快“订单事项”版本LINEART时间,以及:

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

set会员测试是恒定的平均时间。

1

你可以做到这一点

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