带有 if 语句的列表理解 python

list comprehension python with if statement

在尝试锻炼列表理解力时,我重复了所需的值。

我有 2 个列表:L1、L2。如果这些项目小于/等于 L1 中的至少一项,则所需结果是 L2 中的项目列表。

L1=[10,20,30,40,50]
L2=[3,11,51]
L3=[d2 for d2 in L2 for d1 in l1 if d2<=d1]

L3 返回为 [3, 3, 3, 3, 3, 11, 11, 11, 11]

答案包含有效项目,但重复了。 我知道使用 set(),我们可以摆脱重复,但可能我以错误的方式使用了列​​表理解。如有任何澄清,我们将不胜感激。

实现预期结果的循环将是:

L3=[]
for d2 in L2:
    for d1 in L1:
        if d2<=d1:
            L3.append(d2)

您编写的内容经过两个嵌套的 for 循环,只要条件 d2<=d1 为真,就会附加该值。所以我们看到 311 都添加了 每个 L2 中的值,它们小于。

相反,您需要一个更严格的条件来将 d2 添加到 L3,以便您的理解可以是 L3 = [d2 for d2 in L2 if (x)] 的形式,其中 x 是相当于“d2 小于 L1 中的某个值”。有几种方法可以做到这一点,但我发现以下方法有效:

L3 = [d2 for d2 in L2 if (filter(lambda d1: d2<=d1, L1))]

从展开到循环中可以看出,内部循环遍历 L1 中的每个元素,因此 d2 元素将为 每个 [= 添加一次34=] 时间 L2.

中有一个更大的元素

您可以使用 set()(相当于 HepaKKes 建议的 { } 括号)来消除重复,但这效率低下——您仍在创建不需要的中间结果。将是 O(n^2) 时间。

您选择项目的依据是它们 <= 是否优于 L1 中的任何项目。这与询问他们是否 <= max(L1) 相同。所以如下:

L3 = [e for e in L2 if e < max(L1)]

会达到同样的效果。如果提前保存L1的值

L1_max = max(L1)
L3 = [e for e in L2 if e < L1_max]

那么这个解就是O(n).

如果任务是编写一个列表理解,我会这样做:

In [22]: [x for x in L2 if any([y >= x for y in L1])]
Out[22]: [3, 11]