了解python的不同用法';对于';关键词

了解python的不同用法';对于';关键词,python,list,Python,List,我目前正在用Python制作一个“刽子手”类型的游戏。我需要一种方法来检查所有正确选择的字母是否都在解决方案中,以便生成“youwin!”消息。通过使用本教程,我找到了一种使用内置“all()”函数实现此目的的方法: 我成功了,但我真的不明白。我需要帮助打开此行: result = all(elem in list1 for elem in list2) 在简单的英语中,我假设它的意思是“如果列表1中的所有元素也在列表2中,那么结果是真的。” 确切的含义对我来说有点模糊,因为我习惯于只看

我目前正在用Python制作一个“刽子手”类型的游戏。我需要一种方法来检查所有正确选择的字母是否都在解决方案中,以便生成“youwin!”消息。通过使用本教程,我找到了一种使用内置“all()”函数实现此目的的方法:

我成功了,但我真的不明白。我需要帮助打开此行:

result =  all(elem in list1  for elem in list2)
在简单的英语中,我假设它的意思是“如果列表1中的所有元素也在列表2中,那么结果是真的。”

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

更新

感谢@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上的第一篇帖子,再次感谢你们和这个精彩的社区

将表达式放入
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()
从给定迭代器中提取每个值,并检查所有元素的计算结果是否为True

因此,上面的生成器表达式或contains()函数基本上解析为:

[真,假,假]

所以你得到:

result = all([True, False, False])
其中结果为
False


您可以添加任意数量的条件,但随着生成器表达式变得越来越复杂,最好将其解包到自己的函数/生成器中,并单独构建列表/迭代器。

让我们举以下示例

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)
(列表1中的元素表示列表2中的元素)
给出了一个生成器对象,其含义与

for elem in list2:
    # 'remember'(yield) if elem is in list1 or not 
所以对于列表2中的每个元素,它都会记住它是在列表1中(True)还是不在列表1中(False)。如果您查看一下
列表(列表1中的elem代表列表2中的elem)
您会感觉到这一点)

对于示例,这将返回

[True, True, True]    # l1_in_l2
[True, True, True]    # l1_in_l3
[False, True, True]   # l1_in_l4
True   # all(l1_in_l2)
True   # all(l1_in_l3)
False  # all(l1_in_l4)
(2)然后
all
方法只检查此
列表中是否只有真值(如果
list2
的所有元素也可以在
list1
中找到,则为这种情况)

对于示例,这将返回

[True, True, True]    # l1_in_l2
[True, True, True]    # l1_in_l3
[False, True, True]   # l1_in_l4
True   # all(l1_in_l2)
True   # all(l1_in_l3)
False  # all(l1_in_l4)

(3)您可以灵活地添加条件。例如,
all(对于l1中的elem,l2中的elem和l3中的elem)
是一个可能的例子

接近,但逻辑相反。对于列表2中的每个元素(
For elem in list2
),执行逻辑检查以查看该元素是否在列表1中(
elem in list1
),这将根据每个元素返回
True
False
。如果所有这些逻辑检查都为true,则返回
true
。请记住,
list1
在理论上可能比
list2
包含更多的项目,因此区分测试的执行方式非常重要。@roganjosh您能将所有内容加粗并添加一些关于elem的内容吗?对chris Here来说,这似乎是一个可靠的答案。我在电话里聊了一会儿,现在我要去开会了。它没有提到“for的不同用法”,需要对表达部分说些什么谢谢你的详细解释!我发现这门课一点也不直观,但用例子似乎是最好的方法。我现在明白多了。谢谢你的帮助!