如何检查两个列表中的元素是否相同(订单已更改)

时间:2017-06-16 12:54:20

标签: python python-2.7

我正在使用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。

我怎么能这样做?

由于

4 个答案:

答案 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')]