比较两个集合列表

3
例如,我有两个集合列表:
list1 = [{'a','b'}, {'c','d'}, {'a','b','c'}, {'c','f'}]
list2 = [{'c','d','e'}, {'e','f'}, {'a','b','d'}, {'c','f'}]

我需要输出一个索引列表,其中list1[i]和list2[i]不共享相同元素。(没有交集)

在这个例子中,{'a','b'}{'c','d','e'}中没有共同元素。

  1. {'c','d'}{'e','f'}中没有共同元素。
  2. {'a','b','c'}{'a','b','d'}中有共同元素'a''b'
  3. {'c','f'}{'c','f'}中有共同元素'c''f'

因此,list1[0]list1[1]list2[0]list2[1]中没有相同的元素。

它将返回一个索引列表:list = [0,1]

我的方法是:

for l1,l2 in zip(list1,list2):
    for i in l1:
        if i in l2:
            print(i)

这显然是不正确的。任何帮助都将受到赞赏。


显然,您已经知道如何逐对比较列表中的元素,因此实际问题是如何检查两个集合是否有共同元素。 (或者是关于如何获取进行比较的成对索引?您可以使用enumerate迭代普通列表时相同的方式来获取它们。)两个集合共有的元素称为这些集合的交集;而没有共同元素的集合称为不交集。了解术语后,就很容易研究这个问题。 - Karl Knechtel
2个回答

5

您可以对压缩后的列表进行枚举,并根据一对集合是否不相交来过滤索引:

list1 = [{'a','b'}, {'c','d'}, {'a','b','c'}, {'c','f'}]
list2 = [{'c','d','e'}, {'e','f'}, {'a','b','d'}, {'c','f'}]

indices = [i for i, (a, b) in enumerate(zip(list1, list2)) if a.isdisjoint(b)]

# [0, 1]

1
非常感谢!我需要更熟悉运算符。 - Iwishworldpeace
1
itertools 版本:indices = list(compress(count(), map(set.isdisjoint, list1, list2))) - Kelly Bundy
真不错,@KellyBundy。我很少看到map()这样与多个可迭代对象一起使用。在这里运行得很好。 - Mark
1
是的,这似乎和压缩一样罕见/不为人知。我喜欢指出两者的存在 :-) - Kelly Bundy

0
我找到了一个解决方案,我正在使用字典来输出每个集合的公共字母。
iter = [i for i in range(len(list1))]
list3 = []
dict = {}
for i in iter:
    for l1, l2 in zip(list1[i], list2[i]):
        letter = ""
        if l1 not in list2[i]:
            letter += l1
        if l2 not in list1[i]:
            letter += l2
        if letter != '':
        dict[f'Index  {str(i)}'] = letter
print(dict)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接