考虑以下带有示例值的列表
(这里显然是设备名称,序列号和其他无关紧要的值)
我没有提到len表示实际的列表长度。所以我在另一个元素中有2019个元素和2100个元素。
devices_list_foo = ['1', 'HP monitor 500', '1', 'L9K12AZU', 'foo', 'bar']
>>> len(devices_list_foo)
2019
devices_list_bar = ['london-foobar-street', 'hpmon500', 'L9K12AZU', 'some value']
>>> len(devices_list_bar)
2100
我必须找到两个列表之间的匹配项并将它们写入不同的列表。我用以下一行做到了:
common_elements = set(i[3] for i in devices_list_foo).intersection(i[2] for i in devices_list_bar)
这给了我588
列表之间的常见连续出版物。然后我必须列出这些588
剩下的内容 - 机器列表。所以2019 - 588 = 1431
和2100 - 588 = 1512
。我在列表中需要这些1431
和1512
台机器。
这是我尝试过的:
由于common_elements
的类型为set
,因此我可以使用列表理解:
devices_missing_list_foo = [x for x in devices_list_foo if x[3] not in common_elements]
>>> len(devices_missing_list_foo)
1347
devices_missing_list_bar = [x for x in devices_list_bar if x[2] not in common_elements]
>>> len(devices_missing_list_bar)
1512
所以这个1512
似乎是正确的,但为什么我会看到这个1347
而不是1431
。我怎么调查这个?
答案 0 :(得分:2)
我不完全确定我理解你的问题。但我认为一个缺陷是列表中似乎存在重复的值,因此长度小于原始set
的{{1}}。例如:
list
修改强>
所以我们知道:
>>> test_list = [1,2,3,1]
>>> len(test_list)
4
>>> test_set = set(test_list)
>>> len(test_set)
3
是一个集合,因此没有重复但是,由于我们不知道原始列表中存在来自common_elements
的特定值的次数(可能是一次,两次甚至更多),因此您的总和不会累加。又一个例子:
common_elements
注意 >>> a=[1,1,1,2,3]
>>> b=[3,3,3,4,5]
>>> set(a)
set([1, 2, 3])
>>> set(b)
set([3, 4, 5])
>>> common_elements=set(a).intersection(b)
>>> common_elements
set([3])
>>> a_missing=[x for x in a if x not in common]
>>> b_missing=[x for x in b if x not in common]
>>> a_missing
[1, 1, 1, 2]
>>> b_missing
[4, 5]