3 回答

TA贡献2080条经验 获得超4个赞
要检查两个条件type(e)==int,并e not in l2使用and运营商
>>> l1 = [1,2,3,'4']
>>> l2 = [1,2]
>>>
>>> r = [e+e for e in l1 if type(e)==int and e not in l2]
>>>
>>> r
[6]

TA贡献1836条经验 获得超5个赞
尝试使用set:
l1 = [1,2,3,'4']
l2 = [1,2]
print([e+e for e in [x for x in l1 if not x in set(l1).intersection(l2)] if type(e) == int])
输出:
[6]

TA贡献1111条经验 获得超0个赞
如果这是一项真正的任务,并且您想解决这个问题,我强烈建议您使用集来摆脱不需要的元素,因为这将给您线性的时间复杂度,而不是二次的时间。
>>> l1 = [1, 2, 3, '4']
>>> l2 = [1, 2]
>>> s1 = set(l1)
>>> s2 = set(l2)
>>> result = [x * 2 for x in s1.intersection(s2)]
>>> result
[2, 4]
您原来的问题已经在评论和答案中得到了回答。
编辑:如果您对复杂性解释感兴趣:您在代码中正在执行的操作,则需要查找l1in中的每个元素l2。假设l1有n元素,并且l2有m元素。要查找列表或数组中的某些内容,必须查看该列表中的每个元素,因此查找其中的元素会l2很O(m)复杂。你这样做对的每一个元素l1,所以n倍。因此,构建该列表所需的总复杂度为的两倍O(nm)。
但是,对于集合,每个查找都是O(1),因为从本质上讲它是一个哈希表。你仍然需要遍历你的l1,所以O(n),现在的查找固定的时间,所以O(1)。这样一来,我们总共有O(n)。
如果您应该在列表中包含重复的元素,这会有些棘手,但是您仍然可以使用字典或Counters。
添加回答
举报