列表理解

我有下面的代码,我想用列表理解法一行行写出来。

list1 = [4, 5, 6, 9, 10, 16, 21, 23, 25, 27]
list2 = [1, 3, 5, 7, 8, 11, 12, 13, 14, 15, 17, 20, 24, 26, 56]

list3 = []
for i in list1:
    for j in list2:
        if j>i:
            # print(i,j)
            list3.append(j)
            break
print(list1)
print(list3)

输出的是。

[4, 5, 6, 9, 10, 16, 21, 23, 25, 27]
[5, 7, 7, 11, 11, 17, 24, 24, 26, 56]

我不知道该把break语句放在哪里才好

谢谢你的帮助

解决方案:

你不能真正打破列表理解的内部for循环,你能做的是通过使用next函数找到匹配值的第一次出现,从而完全避免不得不打破它。

list1 = [4, 5, 6, 9, 10, 16, 21, 23, 25, 27]
list2 = [1, 3, 5, 7, 8, 11, 12, 13, 14, 15, 17, 20, 24, 26, 56]
list3 = [ next(j for j in list2 if j>i) for i in list1 ]

output。

print(list1)
print(list3)
[4, 5, 6, 9, 10, 16, 21, 23, 25, 27]
[5, 7, 7, 11, 11, 17, 24, 24, 26, 56]

如果你担心性能问题(因为list comprehension会比循环慢),你可以在list2中使用二分搜索来寻找下一个更高的值。

from bisect import bisect_left
list3 = [ list2[bisect_left(list2,i+1)] for i in list1 ]

这假定list2是按升序排列的,并且max(list2) > max(list1)

给TA打赏
共{{data.count}}人
人已打赏
未分类

在Java中,只打印数组中双倍于另一个数字的数字。

2022-9-13 15:35:21

未分类

基于Spring安全URL的授权

2022-9-13 15:46:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索