我正在使用python,我基本上有一个包含不同元素的列表。如果我打印一些元素,它们如下所示:
print('%s'%list[0])
print('%s'%list[1])
Output:
[('A', 'B'), ('D', 'E'), ('B', 'Z'), ('Z', 'D')]
[('B', 'M'), ('M', 'R'), ('B', 'A'), ('R', 'Z'), ('H', 'M')]
我想检查两个列表中是否重复了其中一个元素。但它可以以不同的顺序重复。例如,元素('A','B')重复,但在第二个列表中使用不同的顺序('B','A')。
我想将list [0] [0](即('A','B'))与list [1]的所有元素进行比较,并对元素列表[0] [2]获得true。
我怎么能这样做?
由于
答案 0 :(得分:2)
你可以将你的元组变成集合;这样顺序无关紧要:
a = [('A', 'B'), ('D', 'E'), ('B', 'Z'), ('Z', 'D')]
b = [('B', 'M'), ('M', 'R'), ('B', 'A'), ('R', 'Z'), ('H', 'M')]
a_set = list(set(item) for item in a)
b_set = list(set(item) for item in b)
# create a list of items that are in a and b:
res = [item for item in a_set if item in b_set]
print(res) # [{'A', 'B'}]
如果速度是一个问题你甚至可以这样:
a_set = set(frozenset(item) for item in a)
b_set = set(frozenset(item) for item in b)
res = a_set & b_set
# {frozenset({'A', 'B'})}
然后可以轻松地将其转换回包含res = [tuple(item) for item in res]
元组的列表。
请注意,重复项将在最后一个版本中被视为单个条目。
答案 1 :(得分:1)
如果元素可以多次包含某些项目,并且set
因此不起作用,您还可以使用sorted
来规范化元素中的顺序。
>>> a = [('A', 'B'), ('D', 'E'), ('B', 'Z'), ('Z', 'D')]
>>> b = [('B', 'M'), ('M', 'R'), ('B', 'A'), ('R', 'Z'), ('H', 'M')]
>>> b_set = set([tuple(sorted(x)) for x in b])
>>> [x for x in [tuple(sorted(y)) for y in a] if x in b_set]
[('A', 'B')]
请注意,如果您想使用set
来加快查找速度,则必须将sorted
元素包装到tuples
中,以便它们可以播放。
答案 2 :(得分:0)
如果元素匹配,您可以使用两个for循环来获取true,方法是将它们转换为集合(因为集合没有顺序):
l1 = [('A', 'B'), ('D', 'E'), ('B', 'Z'), ('Z', 'D')]
l2 = [('B', 'M'), ('M', 'R'), ('B', 'A'), ('R', 'Z'), ('H', 'M')]
elementToCompare = set(l1[0])
for i in l2:
if elementToCompare == set(i):
print("%s is the same as %s"%(l1[0], i))
输出:
('A', 'B') is the same as ('B', 'A')
答案 3 :(得分:0)
您可以使用set.intersection
方法从两个(或更多)集合中返回任何共享元素。在下面的示例中,每个元组列表首先转换为一组集合。请注意,每个元组都映射到frozenset
,因此它仍然可以清除。然后,该函数返回任何共享项的列表。为了与原始输入对象类型保持一致,返回列表中的每个项目都将转换回元组。
def listSharedItems( list1, list2 ):
list1_sets = set(map(frozenset,list1))
list2_sets = set(map(frozenset,list2))
intersect = list1_sets.intersection(list2_sets)
return map(tuple,intersect)
>>> # Example usage:
>>> alist = [[('A','B'), ('D','E'), ('B','Z'), ('Z','D')],
[('B','M'), ('M','R'), ('B','A'), ('R','Z'), ('H','M')]]
>>> listSharedItems( alist[0], alist[1] )
>>> [('A', 'B')]