使用列表推导式对列表进行布尔逻辑比较

Boolean-logical Comparison of Lists Using List Comprehension

这是我正在尝试做的事情(在单个列表理解中):

1. 使用逻辑运算符比较 2 个布尔整数列表的关系
2. Return bool-int 值列表,其中:
- a,b均为1时返回1 (1,1)
- 当a==1 and b==0时返回0 (1,0)
- 其他情况被跳过,如 (0,0 & 0,1)

示例逻辑:

A = [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0]
B = [1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0]
L = []

for i in range(len(B)):
    if A[i] + B[i] == 2:
        L.append(1)
    elif A[i]==1 and B[i]==0:
        L.append(0)

打印(L)的预期输出:

[1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1]

我的尝试:(语法错误指向'for')(有点长)

L = [1 if x+y == 2 else 0 if x-y == 1 for x,y in zip(A, B)]  

Wander Nauta 的最佳答案(Pythonic 和快速)

L = [y for x, y in zip(A, B) if x]  

.
我的几个参考点:
- add-sum-of-values-of-two-lists-into-new-list
- if-else-in-a-list-comprehension
- elif-in-list-comprehension-conditionals

用例:
- 比较表示 user/customer 不想要的和给定 product/service
不可用的功能集的列表 - 返回的 1 代表 desires_met,0 代表 desires_unmet
- 进一步 derivatives/analysis 可以很容易地在返回的布尔列表上完成。

这个怎么样?

L = [int(y) for x, y in zip(A, B) if int(x)]

如果 x 为 0,则跳过该项目。否则,如果 y 为 1,则加 1;如果 y 为 0,则加 0。

我认为像这样的东西会更容易阅读和扩展:

A = '11111111111000000010'
B = '11101010101010101010'

result_map = {
    ('1', '1'): 1,
    ('1', '0'): 0,
}

result = [result_map[pair] for pair in zip(A, B) if pair in result_map]

问题比较绕,但我相信你想要的是:

a = [int(x) for x in A] 
b = [int(x) for x in B]
c = [x for x in zip(a, b)]
I = [idx for (idx, x) in enumerate(a) if x == 0]
L = [x for (idx, x) in enumerate(b) if idx not in I]