[英]how does any([a == b for a, b in zip(string, string[1:])]) work
我正在通过在线挑战来学习 Python。
此挑战的目标是分析一个字符串以检查它是否连续包含两个相同的字母。 例如,字符串"hello"
在一行中有两次l
,而字符串"nono"
在一行中没有两个相同的字母。
定义一个名为double_letters
的函数,它接受一个参数。 参数是一个字符串。 如果字符串中的一行中有两个相同的字母,您的函数必须返回True
否则返回False
。
我的解决方案:
def double_letters(word):
for i in range(len(word)):
if word[i] == word[i-1]:
return True
return False
显然,虽然,
def double_letters(string):
return any([a == b for a, b in zip(string, string[1:])])
是一个更好的解决方案,它背后的逻辑是什么(我理解 zip 函数的作用)
请注意,您的函数有一个错误 - 它认为第一个和最后一个字母彼此相邻,并且double_letters('non')
是True
。
(找到作为练习留下的错误。这是一个“一对一”的问题。)
zip(string, string[1:])
从字符串中创建成对的连续字母。
>>> s = "hello"
>>> list(zip(s, s[1:]))
[('h', 'e'), ('e', 'l'), ('l', 'l'), ('l', 'o')]
[a == b for a, b in zip(string, string[1:])]
是一个列表推导式,它解构每一对( for a, b in zip(string, string[1:])
)并产生True
元素当它们相等时, False
元素不相等时。
>>> [a == b for a, b in zip(s, s[1:])]
[False, False, True, False]
any
是接受一个可迭代并返回的功能True
,如果元件中的至少一个是True
。
>>> any([False, False])
False
>>> any([False, True, False])
True
基本上,该代码所做的是将当前字符与其旁边的字符进行比较,只需获取转换版本并进行比较即可。
这是一种花哨而紧凑的写作方式:
return any(a == b where b is the character after a)
zip 的作用是这样的:
[1, 2, 3, 4, 5]
# a b
[1, 2]
[2, 3]
[3, 4]
[4, 5]
[5, None]
...在它们相等的情况下,它将返回 true。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.