猿问

使用列表理解:对不是字符串或另一个列表的元素的列表元素进行计算

我有两个列表l1和l2,它们具有不同类型的元素,如下所示:


l1 = [1,2,3,'4']

l2 = [1,2]

我想对l1中不在l2中且不是string类型的每个元素进行计算。所以我想知道是否有可能以某种方式隔离列表理解中的整数和字符串。


首先,下面是一个示例,其中如果e不位于l2中,则将l1中的每个元素e添加到自身:


# code

r = [e+e for e in l1 if e not in l2]

print(r)


# result

# [6, '44']

由于它是字符,因此这里重复“ 4”,而不添加,但我想忽略该元素。所以我在想我可以隔离类型为(e)== int的元素。


天真的尝试:


# code

r = [e+e for e in l1 if type(e)==int not in l2]


# output

[2, 4, 6]

在这里,l1中的'4'似乎被忽略了,因为它不是整数,但是即使不是l2中的3也被加到了自身上。


这是怎么回事(除了我不理解列表理解之外的事实)?


一只斗牛犬
浏览 180回答 3
3回答

犯罪嫌疑人X

要检查两个条件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]

一只甜甜圈

尝试使用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]

catspeake

如果这是一项真正的任务,并且您想解决这个问题,我强烈建议您使用集来摆脱不需要的元素,因为这将给您线性的时间复杂度,而不是二次的时间。>>> 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。
随时随地看视频慕课网APP

相关分类

Python
我要回答