Python 检查列表中没有的组合

Python 检查列表中没有的组合,python,Python,简化–有一个口述: flags = { 'a': 0, 'b': 1, 'c': 1, 'd': 0, 'e': 1, 'f': 1 } 现在有些组合是不允许的: no_combo = [ ['a', 'c'], ['b', 'd', 'e'] ] 如何最好地验证我在标志中没有根据无组合不允许的组合 从上面的例子中,我们有一个冲突,因为b和e都设置为1 set_flags = [k for k in flags if flags[k]] 给出: ['b', 'c', 'e'

简化–有一个口述:

flags = { 'a': 0, 'b': 1, 'c': 1, 'd': 0, 'e': 1, 'f': 1 }
现在有些组合是不允许的:

no_combo = [
    ['a', 'c'],
    ['b', 'd', 'e']
]
如何最好地验证我在
标志中没有根据
无组合
不允许的组合

从上面的例子中,我们有一个冲突,因为
b
e
都设置为
1

set_flags = [k for k in flags if flags[k]]
给出:

['b', 'c', 'e', 'f']
这与禁止组合
无组合[1]
的限制相冲突:

['b', 'd', 'e']
现在要交叉检查
无组合

我有这个:

for combo in no_combo:
    if len([f for f in combo if f in set_flags]) > 1:
        print('fail on', combo)
但是想知道是否有更好的方法来解决这个问题

例如,是否有类似于
all()
any()
的方法用于此目的?

您可以使用:

输出

fail on ['b', 'd', 'e']
这将保存列表创建(您在调用len时使用的列表创建)。请注意,这假定标志的值为0或1

您还可以使用while循环,并在总和达到2时将其中断。例如:

for combo in no_combo:
    total = 0
    for c in combo:
        total += flags.get(c, 0)
        if total > 1:
            print('fail on', combo)
            break
这有点麻烦,但避免了重复整个列表,因此节省了一些时间。

您可以使用:

输出

fail on ['b', 'd', 'e']
这将保存列表创建(您在调用len时使用的列表创建)。请注意,这假定标志的值为0或1

您还可以使用while循环,并在总和达到2时将其中断。例如:

for combo in no_combo:
    total = 0
    for c in combo:
        total += flags.get(c, 0)
        if total > 1:
            print('fail on', combo)
            break

这有点麻烦,但避免了重复整个列表,因此节省了一些时间。

Sweet:),这看起来很有希望。我知道有更好的办法❤在我的代码中,标志仅为
0
1
。但是可以这样说:
sum(组合中c的flags.get(c,0)>0)
——如果这是一个问题的话,就像在“>0”中一样。True/False将转换为0/1表示对噪音的担忧–但不确定使用while循环是什么意思。它按原样工作,-但奇怪的是,你不需要做整个求和,只要while小于2,那么你就可以做while循环并保留一个计数器变量。我希望现在更清楚了。@user3342816为我的答案添加了一个例子。Sweet:),这看起来很有希望。我知道有更好的办法❤在我的代码中,标志仅为
0
1
。但是可以这样说:
sum(组合中c的flags.get(c,0)>0)
——如果这是一个问题的话,就像在“>0”中一样。True/False将转换为0/1表示对噪音的担忧–但不确定使用while循环是什么意思。它按原样工作,-但奇怪的是,你不需要做整个求和,只要while小于2,那么你就可以做while循环并保留一个计数器变量。我希望现在更清楚了。@user3342816在我的答案中添加了一个例子。