从两个列表应用约束中创建一个列表

aer*_*ite 3 python list

我有两个清单A,B

A = [2,3,1,4,5,2,4]
B = [4,2,3,6,2,5,1]
Run Code Online (Sandbox Code Playgroud)

我想把这个A和B结合起来:

C = [2,4,2,3,1,3,4,6,2,5,2,5,1,4]
Run Code Online (Sandbox Code Playgroud)

规则:

  1. A [i] <= B [i],取A [i],然后B [i]
  2. A [i]> B [i],取B [i],然后A [i]

我可以使用如下循环来做到这一点:

C = []

for a,b in zip(A,B):
    if(a<=b):
        C.append(a)
        C.append(b)
    else:
        C.append(b)
        C.append(a)
Run Code Online (Sandbox Code Playgroud)

这实际上有效.我怎么能这样做:

 C = [ [a,b if (a<=b)],[ b,a else] for a,b in zip(A,B)] # This is totally wrong
Run Code Online (Sandbox Code Playgroud)

但是我怎么能用if-else做到这一点

sbe*_*rry 5

你做这件事的方式很好,因为它非常易读......但是如果一个单行代码就是你所追求的,我会强迫:

>>> A = [2,3,1,4,5,2,4]
>>> B = [4,2,3,6,2,5,1]
>>> [i for sublist in [[a, b] if a < b else [b, a] for a, b in zip(A, B)] for i in sublist]
[2, 4, 2, 3, 1, 3, 4, 6, 2, 5, 2, 5, 1, 4]
Run Code Online (Sandbox Code Playgroud)

几点说明:

  1. 向条件comp添加条件时,在列表comp中if - else的第一个变量之后右键. ['a' if i in (2, 4, 16) else 'b' for i in [1, 2, 3, 16, 24]]

  2. 构建(精神上)嵌套列表推导的最佳方法是考虑如何在正常循环中编写它.


C = [[a, b] if a < b else [b, a] for a, b in zip(A, B)]
for sublist in C:
    for i in sublist:
        yield i
Run Code Online (Sandbox Code Playgroud)

然后你只需展平嵌套循环并移动yield i到前面,然后放下yield.

for sublist in C for i in sublist yield i
|-> yield i for sublist in C for i in sublist
    |-> i for sublist in C for i in sublist
Run Code Online (Sandbox Code Playgroud)

现在你可以用上面的列表comp替换C并获得我发布的单行.