逻辑运算 (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) - 有没有办法简化长条件语句?的主要内容,如果未能解决你的问题,请参考以下文章