这个问题专门针对使用生成器语句而来自Udacity计算机程序设计课程的这个程序:
旨在解决这个难题https://en.wikipedia.org/wiki/Zebra_Puzzle 这个img可能更具可读性http://imgur.com/klkaSry
import itertools
def zebra_puzzle():
houses = [first, _, middle, _,_] = [1,2,3,4,5]
orderings = list(itertools.permutations(houses))
return next((WATER, ZEBRA)
for (red, green, ivory, yellow, blue) in orderings
if im_right(green,ivory)
for (Englishman, Spaniard, Ukranian, Japanese, Norwegian) in orderings
if Englishman is red
if first is Norwegian
if nextto(Norwegian, blue)
for (dog, snails, fox, horse, ZEBRA) in orderings
if Spaniard is dog
for (coffee, tea, milk, oj, WATER) in orderings
if coffee is green
if Ukranian is tea
if middle is milk
for (OldGold, Kools, Chesterfields, LuckyStrike, Parliaments) in orderings
if OldGold is snails
if Kools is yellow
if nextto(Chesterfields, fox)
if nextto(Kools,horse)
if LuckyStrike is oj
if Parliaments is Japanese
)
def im_right(h1,h2):
return h1-h2 == 1
def nextto(h1,h2):
return abs(h1-h2) == 1
def main():
zebra_puzzle()
if __name__ == '__main__':
main()
我一直在Project Euler中遇到问题,这会有用,但我最终不得不使用普通的嵌套循环。
此外,这个问题还可以吗?
答案 0 :(得分:1)
这是一个生成器表达式语法。它与多行一起工作的原因是因为他用()将它包裹起来(通常它用一行短的语句写成,以便明显更简洁,更清晰)
您可以看到更多详情here
此语法的工作原理如下:
(one_value for one_value in my_list if one_value == 0)
第一个one_value是我们想要对列表中的每个元素执行的操作(因此我们可以执行类似one_value + 1的操作来返回所有值增加1的列表)
比一个"对于one_value"这样我们称每个元素为名称
"在my_list" - 指定我们正在迭代的女巫名单
"如果one_value == 0" - 将应用于列表中每个值的条件
答案 1 :(得分:0)