2011-06-24 59 views
4

Python中的一个子集,因为对两个名单:
列表是另一个列表

listA = [ [1,20], [3,19], [37,11], [21,17] ] 
listB = [ [1,20], [21,17] ] 

你如何高效地编写Python函数返回True如果数组listB是listA的一个子集?哦和[1,20]对相当于[20,1]

+2

是[[1,20],[2,30]等于[[2, 30],[1,20]]? – Trevor

+0

这些列表是否可以包含任何内容,或者它们是否总是包含数字?如果总是数字,这些数字总会是正数吗? –

+0

@ sean-vieira - 是的,数字总是正面的;和@threed - 订单无关紧要,因此这些清单相当于 – dimka

回答

11

使用frozenset

>>> listA = [ [1,20], [3,19], [37,11], [21,17] ] 
>>> listB = [ [1,20], [21,17] ] 

>>> setA = frozenset([frozenset(element) for element in listA]) 
>>> setB = frozenset([frozenset(element) for element in listB]) 

>>> setA 
frozenset([frozenset([17, 21]), frozenset([1, 20]), frozenset([11, 37]), frozens 
et([19, 3])]) 
>>> setB 
frozenset([frozenset([17, 21]), frozenset([1, 20])]) 

>>> setB <= setA 
True 
+0

+1 - 最好使用内置方法而不是重新发明轮子! –

8

只是为了提供一种替代,可能使用的元组,并设置是更有效的:

>>> set(map(tuple,listB)) <= set(map(tuple,listA)) 
True