比较同一字典中不同列表之间的差异

7
在简历中,我有一个字典里面有两个键,每个键都有其对应的列表。
我尝试比较这两个列表以检查它们的共同和差异元素。也就是说,输出将统计有多少元素相同或仅存在于一个键的列表中。
从一开始我就使用文件作为参数插入元素,它们在函数中被读取。
def shared(list):
        dict_shared = {}
        for i in list:
                infile = open(i, 'r')
                if i not in dict_shared:
                        dict_shared[i] = []

                for line in infile:
                        dict_shared[spacer].append(record.id)

        return dict_shared

现在我被卡住了,试图找到一种比较字典中创建和呈现的列表的方法。

dict = {a:[1,2,3,4,5], b:[2,3,4,6]}

我的意图是比较这两个列表,以便找出两个文本之间共享的行。

a: [1,5]
b: [6]
a-b: [2,3,4]

现在我找不到解决这个问题的方法。有什么建议吗?


1
为什么 a == [2,5] 而不是 [1,5]? - jizhihaoSAMA
我不确定你在处理文件方面做了什么,但是你几乎总是应该在with open(...) as file:块中使用open,这样当文件不再需要时它会自动关闭/释放。 - johannesack
@jizhihaoSAMA,感谢您指出这一点。 - F.Lira
@JohannesAck 这不会是一个大问题,但我会接受你的建议。 - F.Lira
这也可以使用numpy完成(出于性能问题)。请参阅https://dev59.com/c3I-5IYBdhLWcg3w6tFR - Ivan Calderon
6个回答

5
您可以使用set:
d = {'a':[1,2,3,4,5], 'b':[2,3,4,6]}
print(list(set(d['a'])-set(d['b'])))
print(list(set(d['b'])-set(d['a'])))
print(list(set(d['b'])&set(d['a'])))

结果:

[1, 5]
[6]
[2, 3, 4]

我在想是否有办法在代码中写更少的行来完成这个任务。 - F.Lira
嗯,我觉得三行代码不太多。你有什么想法吗? - jizhihaoSAMA

5

你可以利用 python 内置函数,如uniondifferenceintersection 来实现这一点。

注意: 这些函数是针对 set 的,你可以通过以下方式将list 转换为 set:

1stset = set(a)

例如:

print(1stset.difference(2ndset))

print(1stset.intersection(2ndset))

print(1stset.union(2ndset))

以下是更多信息的参考链接: https://www.geeksforgeeks.org/python-intersection-two-lists/ https://www.geeksforgeeks.org/python-union-two-lists/ https://www.geeksforgeeks.org/python-difference-two-lists/

最好提供解决方案或Stack Overflow链接,而不是其他网站链接,以获得其他好处。 - sahasrara62
我在来这里之前就看到过它,但我的情况是将列表放在一个字典中,所以我试图以某种递归方式完成它。 - F.Lira

4
一个使用列表推导式的解决方案为:
dictionary = {'a':[1,2,3,4,5], 'b':[2,3,4,6]}

only_in_a = [x for x in dictionary['a'] if not x in dictionary['b']]
only_in_b = [x for x in dictionary['b'] if not x in dictionary['a']]
in_both = [x for x in dictionary['a'] if x in dictionary['b']]

请注意,对于更大的列表,这种方法在复杂性方面并不特别明智。

那是我的情况。有些文件包含超过3000行。 - F.Lira

3

我不确定我是否正确理解了您想要实现的目标,但似乎您需要使用集合运算:

dictionary = {"a":[1,2,3,4,5], "b":[2,3,4,6]}

#in a but not in b
set(dictionary["a"]) - set(dictionary["b"])

#in b but not in a
set(dictionary["b"]) - set(dictionary["a"])

#union of both
set(dictionary["b"]).union(set(dictionary["a"]))

#intersection of both
set(dictionary["b"]).intersection(set(dictionary["a"]))

3
您可以尝试类似以下的方法。
mydict = {'a': [1,2,3,4,5], 'b': [2,3,4,6]}

>>> list(set(mydict['a']).intersection(mydict['b']))  # common to both
 [2, 3, 4]
>>> list(set(mydict['a']).difference(mydict['b']))  # a - b
 [1, 5]
>>> list(set(mydict['b']).difference(mydict['a']))  # b - a
 [6]
>>> list(set(mydict['a']).union(mydict['b']))  # union of both
 [1, 2, 3, 4, 5, 6]

2

试试这个

print("a - b : {} ".format(list(set(_dict['a']) - set(_dict['b']))))
print('b - a : {} '.format(list(set(_dict['b']) - set(_dict['a']))))
print('a \u2229 b : {} '.format(list(set(_dict['a']).intersection(set(_dict['b'])))))

输出

a - b : [1, 5] 
b - a : [6] 
a  b : [2, 3, 4]

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