为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只斗牛犬 2021-04-02 18:10:28
我有两个列表l1和l2,它们具有不同类型的元素,如下所示:l1 = [1,2,3,'4']l2 = [1,2]我想对l1中不在l2中且不是string类型的每个元素进行计算。所以我想知道是否有可能以某种方式隔离列表理解中的整数和字符串。首先,下面是一个示例,其中如果e不位于l2中,则将l1中的每个元素e添加到自身:# coder = [e+e for e in l1 if e not in l2]print(r)# result# [6, '44']由于它是字符,因此这里重复“ 4”,而不添加,但我想忽略该元素。所以我在想我可以隔离类型为(e)== int的元素。天真的尝试:# coder = [e+e for e in l1 if type(e)==int not in l2]# output[2, 4, 6]在这里,l1中的'4'似乎被忽略了,因为它不是整数,但是即使不是l2中的3也被加到了自身上。这是怎么回事(除了我不理解列表理解之外的事实)?
查看完整描述

3 回答

?
犯罪嫌疑人X

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]


查看完整回答
反对 回复 2021-04-13
?
一只甜甜圈

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]


查看完整回答
反对 回复 2021-04-13
?
catspeake

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。


查看完整回答
反对 回复 2021-04-13
  • 3 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号