gpt4 book ai didi

python - 概念化分解枚举的列表理解

转载 作者:行者123 更新时间:2023-12-01 00:56:23 24 4
gpt4 key购买 nike

我从这里开始并喜欢列表理解。我发现下面这行代码用于解决将字符串中的每个其他字母大写的练习问题,这对我来说很有意义。我希望得到帮助的问题是弄清楚如何在没有列表理解的情况下正常编写此代码(for 循环、if 语句等初学者的东西)。

这是我想要分解的开始代码:

s = input('Please enter a string: ')
answer = ''.join(char.upper() if idx % 2 else char.lower() for idx, char in enumerate(s))
print(answer)

这是我认为重现上面代码所做的事情的正确代码:

s = input('Please enter a string: ')
for idx, char in enumerate(s):
if idx % 2:
s = char.upper()
else:
s = char.lower()
answer = ''.join(s)
print(answer)

如果我输入 Hello,我应该得到 hElLo,但我得到的是 o

如果您能提供有关如何继续操作的建议或提示,我将不胜感激。谢谢!

最佳答案

从技术上讲,您正在使用 generator expression, and not a list comprehension 。但本例的结果是相似的。

您正在将输入读取到 s 中,但随后您在每次迭代中重新分配 s,然后加入 s .

您需要有一个不同的变量。对于输入和大写列表。生成器表达式的作用是一次返回一个值,而不是一次构建整个大写列表。但在这里你需要声明它。

此外,在每次迭代中分配答案是没有意义的,一旦准备好大写列表,join 就是您需要做的最后一件事。

这应该有效:

toCapitalize = input('Please enter a string: ')
capitalizedList = []

for idx, char in enumerate(toCapitalize):
if idx % 2:
capitalizedList.append(char.upper())
else:
capitalizedList.append(char.lower())

answer = ''.join(capitalizedList)
print(answer)

如果这有帮助,我试图反射(reflect)哪一行与下面的生成器表达式的哪一部分相匹配:

for idx, char in enumerate(toCapitalize):            # for idx, char in enumerate(s)
if idx % 2: capitalizedList.append(char.upper()) # char.upper() if idx % 2
else: capitalizedList.append(char.lower()) # else char.lower()
answer = ''.join(capitalizedList) # answer = ''.join()

同样,capitalizedList 变量隐含在生成器表达式或列表推导式中。

生成器表达式

要理解生成器表达式,请查看以下代码:

capitalize = 'hello'
generator = (char.upper() if idx % 2 else char.lower() for idx, char in enumerate(capitalize))
print(next(generator)) # h
print(next(generator)) # E
print(next(generator)) # l
print(next(generator)) # L
print(next(generator)) # o
print(next(generator)) # raises a StopIteration exception, we've reached the end.

每次调用 next() 都会即时计算下一次迭代的结果。当您有大列表时,这比立即构建整个列表更有效。在您的情况下,对 join() 的调用会消耗所有生成器,并连接返回的值。

作为列表理解

作为列表理解的代码将是:

s = input('Please enter a string: ')
answer = ''.join([ char.upper() if idx % 2 else char.lower() for idx, char in enumerate(s) ])
print(answer)

正如我上面所解释的,不同之处在于我们一次构建整个列表,生成器一次仅返回一个值。

您的代码作为生成器

最后,为了在技术上正确,您的代码将相当于:

def generator(s):
for idx, char in enumerate(s):
if idx % 2:
yield char.upper()
else:
yield char.lower()

answer = ''.join(generator(s))
print(answer)

这就是在 Python 中构建生成器的方法。

关于python - 概念化分解枚举的列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56214740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com