逻辑运算 (Python 3.4) - 有没有办法简化长条件语句?

Posted

技术标签:

【中文标题】逻辑运算 (Python 3.4) - 有没有办法简化长条件语句?【英文标题】:Logic operations (Python 3.4) - is there a way to simplify long conditional statements? 【发布时间】:2015-01-13 11:19:39 【问题描述】:

我有以下整数列表,需要相互交叉比较:

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?

提前感谢您的帮助!

【问题讨论】:

如果每个列表上都有唯一编号,您可以使用集合而不是列表。 【参考方案1】:

对于这个问题,我建议使用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]

【讨论】:

我理解这个问题的方式是,OP 只想迭代 c 中的值,而不是全部。 @LukasGraf 我认为c1-c4 的意思是所有的内部列表!因为我们有 4 个列表!他的比较还包含 c , 啊。由于他将子列表命名为a, b, c, d,我首先假设c1-c4 指的是c 中的值,但看起来你是对的。 @LukasGraf 是的,这是 OP 的错误。【参考方案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 unpacking 将compare 中的4 个子列表中的每一个分配给一个单独的变量,any() 中的表达式称为generator expression。

【讨论】:

【参考方案3】:

在 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

【讨论】:

非常感谢,这肯定会在迭代列表时简化事情!【参考方案4】:

创建一个布尔数组,如下所示:

present = [any_given_integer in L for L in compare]

现在 present 具有 [True, True, False, False] 等值。

然后你可以做如下测试:

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

if all(present):
    ...

等等

【讨论】:

以上是关于逻辑运算 (Python 3.4) - 有没有办法简化长条件语句?的主要内容,如果未能解决你的问题,请参考以下文章

Python科学计算库Numpy

Python 3.4 中的“异步 for”

笨办法学Python(二十八)

笨办法学Python(二十七)

有没有办法在 Python 中对 FITS 文件使用算术运算?

有没有办法在 python 中使用点运算符传递参数?