了解python'for'关键字的不同用法

时间:2019-09-18 08:04:43

标签: python list

我目前正在用Python制作“ Hangman”型游戏。我需要一种方法来检查是否所有正确选择的字母都在解决方案中,以便“您赢了!”消息可能会生成。我通过使用本教程找到了一种使用内置的“ all()”函数来做到这一点的方法:

https://thispointer.com/python-check-if-a-list-contains-all-the-elements-of-another-list/

我使它工作了,但我不太了解。我需要打开这行包装的帮助:

result =  all(elem in list1  for elem in list2)

用通俗的英语来说,我认为这样的意思是“如果list1中的所有元素也都在list2中,则结果为true。”

确切的含义对我来说有点模糊,因为我习惯于只在“ for”循环中使用“ for”,它位于行的开头。有人可以澄清吗?另外,如果我想向all()函数添加另一个条件怎么办?例如:list1中的所有内容都在list2 和list3 中。

更新

感谢@roganjosh的澄清。阅读您的消息后,我已经对此进行了一些尝试:

list1 = ['a', 'b', 'c']
list2 = ['d', 'e', 'f']
list3 = ['g', 'h', 'i']
list4 = ['a', 'b', 'c', 'd', 'e', 'f']

# all of list1 is in list4
print('all(elem in list4 for elem in list1) == ' + str(all(elem in list4 for elem in list1)))

# All of list1 and list2 are in list4
print('all(elem in list4 for elem in list1 and list2) == ' + str(all(elem in list4 for elem in list1 and list2)))

# Not all of list1 and list3 are in list4
print('all(elem in list4 for elem in list1 and list3) == ' + str(all(elem in list4 for elem in list1 and list3)))

这是我在StackOverflow上的第一篇文章,再次感谢您和这个美好的社区!

2 个答案:

答案 0 :(得分:0)

将表达式放在all()函数或类似函数中时,它会成为生成器表达式

所以这个:

result =  all(elem in list1  for elem in list2)

与此相同:

list1 = [1,2,3]
list2 = [3,4,5]

def contains(l2, l1):
    for item in l2:
        yield item in l1

result = all(contains(list2, list1))

all()从给定的 iterator 中提取每个值,并检查所有元素的计算结果是否为 True

所以基本上 generator表达式 contains()函数可以解析为:

  

[真,假,假]

所以您得到:

result = all([True, False, False])
  

结果 False

您可以添加任意多个条件,但是随着 generator表达式变得越来越复杂,最好将其解压缩到其自己的函数/生成器中并分别构建列表/迭代器。< / p>

答案 1 :(得分:0)

让我们举个例子

l1 = [1,2,3]
l2 = [1,2,3,4,5]
l3 = [1,4,5,3,2]
l4 = [2,3]

l1_in_l2 = [elem in l2 for elem in l1]
l1_in_l3 = [elem in l3 for elem in l1]
l1_in_l4 = [elem in l4 for elem in l1]

(1) (elem in list1 for elem in list2)给出一个生成器对象,其含义与

相同
for elem in list2:
    # 'remember'(yield) if elem is in list1 or not 

因此,对于列表2中的每个元素,它都会记住它是否在list1中(真)或否(假)。如果您看一下list(elem in list1 for elem in list2),您会感觉到)。

对于示例,它将返回

[True, True, True]    # l1_in_l2
[True, True, True]    # l1_in_l3
[False, True, True]   # l1_in_l4

(2),然后all方法仅检查此list中是否只有True值(如果list2的所有元素都是这种情况也可以在list1中找到)。

对于示例,它将返回

True   # all(l1_in_l2)
True   # all(l1_in_l3)
False  # all(l1_in_l4)

(3),您可以灵活地添加条件。例如all(elem in l2 and elem in l3 for elem in l1)是一个可能的示例。