列出与理解的比较,在Python中给出不充分的结果

时间:2015-02-26 14:15:35

标签: python list list-comprehension

考虑以下带有示例值的列表

(这里显然是设备名称,序列号和其他无关紧要的值)

我没有提到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 = 14312100 - 588 = 1512。我在列表中需要这些14311512台机器。

这是我尝试过的: 由于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。我怎么调查这个?

1 个答案:

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