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在我的答案中添加了一个例子。