逻辑运算(Python 3.4) - 是否有一种简化长条件语句的方法?

时间:2014-11-16 13:37:15

标签: python if-statement python-3.x logic logical-operators

我有以下整数列表,我需要将它们相互比较:

compare = [[2,4,5,7,8,10,12],[1,3,5,8,9,10,12],[1,2,4,6,8,10,11,12],[2,3,4,6,7,9,12]]

即使你不能在Python中的列表中命名列表(我认为),我们也只需要调用每个子列表a,b,c和d。

我想做的是制作一个for循环,可以比较2,3或者所有列表中是否存在任何一个整数。它本身的循环很简单,它遍历a-d中的所有整数,但是进行比较的条件非常复杂,或者可能只是长时间的缠绕,例如:

    if i in a and i in b, or i in a and i in c... or i in a and i in b and i in c... or i in (every list):
        pattern.append (i)

显然这是不切实际的。我找到了问题的解决方案,但无济于事。还有,&和|操作员无论如何都可以使用,还是应该坚持使用AND和OR?

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

因此,您只想对c中的值进行迭代,并检查它是否在其他任何列表(a, b, d)中?然后你可以使用any()内置来实现这个目标:

compare = [
    [2, 4, 5, 7, 8, 10, 12],
    [1, 3, 5, 8, 9, 10, 12],
    [1, 2, 4, 6, 8, 10, 11, 12],
    [2, 3, 4, 6, 7, 9, 12]
]

a, b, c, d = compare

pattern = []
for value in c:
    if any(value in lst for lst in (a, b, d)):
        pattern.append(value)

a, b, c, d = compare行正在使用list unpackingcompare中的4个子列表中的每一个分配给一个单独的变量,而any()中的表达式称为{{ {3}}

答案 1 :(得分:2)

我建议使用itertools.chain链接所有元素,然后计算所需元素的数量:

>>> import itertools
>>> new_list=list(itertools.chain(*compare))
[2, 4, 5, 7, 8, 10, 12, 1, 3, 5, 8, 9, 10, 12, 1, 2, 4, 6, 8, 10, 11, 12, 2, 3, 4, 6, 7, 9, 12]

>>> pattern=[i for i in new_list if new_list.count(i)>2]
>>> pattern
[2, 4, 8, 10, 12, 8, 10, 12, 2, 4, 8, 10, 12, 2, 4, 12]

答案 2 :(得分:1)

在Set()上,您可以使用交集并查找两个列表中的所有值。

a = [2,4,5,7,8,10,12]
b = [1,3,5,8,9,10,12]
set(a).intersection(set(b)) 

=> set([8, 10, 12, 5])

It will be explained here

答案 3 :(得分:1)

制作一系列布尔值,如下所示:

present = [any_given_integer in L for L in compare]

现在存在的值为[True, True, False, False]

然后你可以做以下测试:

if present.count(True) == 2:
    ...

if all(present):
    ...