如何检查列表中的任何两项是否在另一个列表中?
我正在尝试研究如何测试列表中是否出现某些单词组合。例如:
l1 = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
if all(['A', 'C', 'D']) or all(['A', 'D']) or all(['C', 'D'])in l1:
print('Violation')
该想法是确定A
和C
中的一个(或两个)是否与D
同时存在。
我已经尝试了上面的代码,但是由于总是假设仅检查单个清单中的任何一项是否在L1
内,所以我总是会遇到违规行为。
答案 0 :(得分:2)
如果要检查这些子集,则必须分别检查每个子集。您对all
的使用也不正确。 all
检查传递给它的序列中的所有元素是否都是"Truthy"。
all(['A', 'B', 'C'])
# True
因此您的if
实际上减少为:
if True or True or True in l1:
表达式短路到if True
,因此它总是被执行。 。
为此,我将对set.issuperset()
列中的每个子集执行一次df
检查。
subsets = [{'A', 'C', 'D'}, {'A', 'D'}, {'C', 'D'}]
columns = set(df)
if any(columns.issuperset(s) for s in subsets):
print('Violation')
答案 1 :(得分:2)
我不确定我是否完全理解您的问题...
此代码检查l1中是否存在['A','D'] and
['C','D']。
if all(i in l1 for i in ['A', 'D']) and all(i in l1 for i in ['C', 'D']):
print('Violation')
如果您想要or
条件,
if all(i in l1 for i in ['A', 'D']) or all(i in l1 for i in ['C', 'D']):
print('Violation')
答案 2 :(得分:2)
当您说全部(['A','C','D'])时,每个字母都会转换为True布尔值,从而使all()语句为true,“ Violation”将总是被打印。这是一种解决方法:
l1 = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
pattern1 = ['A', 'C', 'D']
pattern2 = ['A', 'D']
pattern3 = ['C', 'D']
for pat in [pattern1, pattern2, pattern3]:
if all(letter in l1 for letter in pat):
print("Violation")
break