逻辑操作(Python 3.4)-是否有一种方法可以简化长的条件语句?

4
我有以下整数列表,需要进行交叉比较:

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?感谢您提前的任何帮助!

如果每个列表中都有唯一的数字,您可以使用集合而不是列表。 - syntagma
4个回答

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 使用了列表解包,将compare中的4个子列表分别赋值给不同的变量。而any()函数中的表达式则被称为生成器表达式


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]

我理解这个问题的方式是,OP只想迭代c中的值,而不是所有的值。 - Lukas Graf
@LukasGraf 我认为 OP 指的是 c1-c4 中所有的内部列表!因为我们有 4 个列表!他的比较中也包含 c。 - Mazdak
啊。由于他将子列表命名为a,b,c,d,我最初认为c1-c4是指c中的值,但看来你是对的。 - Lukas Graf
@LukasGraf 是的,这是OP的错误。 - Mazdak

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])

这里将会解释


非常感谢,这确实简化了在列表迭代时的操作! - Jim Jam

1
制作一个布尔数组,如下所示:
present = [any_given_integer in L for L in compare]

现在,present变量的值是[True, True, False, False]等。
然后,您可以进行如下测试:
if present.count(True) == 2:
    ...

或者

if all(present):
    ...

etc.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接