【问题标题】:For loop prints different output Can this be checked pleaseFor循环打印不同的输出可以检查吗
【发布时间】:2020-12-05 20:25:57
【问题描述】:

我对 for 循环的工作方式感到非常沮丧。生病发布两个场景。我的输出应该是 “12 abc”-->“12 Abc”,如果“12abc”-->“12abc”(输出)。但我为此想出了两个解决方案:

s= '12 abc'
a_string = s.split()
for word in a_string:
    print(" ".join(word.capitalize()))

如果我使用这个 for 循环,我得到的输出为 “1 2 A b c"

*另一种解决方案 print(' '.join(word.capitalize() for word in a_string))

如果我使用这个 for 循环,我会得到正确的解决方案“12 Abc”

但是,

for word in a_string:
        print("".join(word.capitalize()),end=' ')

上面的代码最后打印了一个空格。我也不想要那个额外的空间。

【问题讨论】:

  • word.capitalize() 是一个字符串。当您将字符串传递给" ".join() 时,它将被视为“字符列表”。所以你基本上是在做" ".join(["1", "2"])等。
  • print(' '.join(word.capitalize() for word in a_string)) --- 这里也一样。但这给出了正确的输出。这里的词也指字符串。请解释
  • 那是因为word.capitalize() for word in a_string 不是字符串。它是一个“生成器”(有点像列表)。您需要意识到您正在将一个字符串传递给join。这就是你沮丧的根源。当您将字符串传递给需要列表的函数时,该字符串将被视为“字符列表”。
  • 是的,我差不多明白了,你能说一下 word.capitalize() for word in a_string 和 for word in a_string: print(" ".join(word.capitalize())) 有何不同说第一个是生成器,但第二个你说它是一个字符串。你怎么知道它是一个生成器
  • 查看我的更新答案。我认识到这种形式是一个生成器(它在 python 中被大量使用)。它总是看起来像这样:f(x) for x in list_of_x

标签: python for-loop capitalize


【解决方案1】:

试试这个:

s= '12 abc'
a_string = s.split()
capitalized_strings = []
for word in a_string:
    capitalized_strings.append(word.capitalize())

print(" ".join(capitalized_strings))

请注意,我将大写单词放入列表中,然后将join 与此列表一起使用。

您的问题是您将字符串传递给join。这将字符串视为字符列表。 所以你基本上是在做" ".join(["1", "2"])

生成器的解释:

当你写作时

word.capitalize() for word in a_string

它返回一个叫做generator的东西。生成器像列表一样“可迭代”。

例如,如果您这样做(其中a_string 是字符串列表):

a_string = ["12", "abc"]
list_of_words = [word.capitalize() for word in a_string]
print(list_of_words)

那么你会得到这个:

["12", "Abc"]

这被称为“列表理解”。

所以当你写的时候:

" ".join(word.capitalize() for word in a_string)

它给出的结果与你这样做的结果相同:

" ".join(["12", "Abc"])

所以join 将加入该列表中的两个元素,它们之间有一个 " " 空格。

这与调用不同:

" ".join("Abc")

如果您将字符串传递给join,则与您执行此操作相同:

" ".join(["A", "b", "c"])

因为字符串被解释为“字符列表”。

使用此代码查看打印的所有内容,因为它是逐步计算的:

s = "12 abc"
print(s)

s_list = s.split()
print(s_list)

s_capitalized_list = [x.capitalize() for x in s_list]
print(s_capitalized_list)

result = " ".join(s_capitalized_list)
print(result)

请注意,我在列表理解的生成器中使用了x。这是为了告诉你,你选择的名字并不重要。

【讨论】:

  • 但是你能解释一下 join 是如何将它视为一个字符的吗,但是这个也是一样的,但是这个给出了正确的答案 print(' '.join(word.capitalize() for word in a_string) )
  • 我在回答中添加了很多解释。我希望现在清楚了。
【解决方案2】:
s = "123 abc"
result = s.title() if ' ' in s else s
print(result) # "123 Abc"

# try changing the s to "123abc" and see the result

试试这个。这有点pythonic。

【讨论】:

  • 我认为这并不是我们所需要的。例如,考虑`s="123 123abc"。那应该输出“123 123abc”,但你的方法会输出“123 123Abc”
  • 是的。也许我们可以将字符串拆分为空格,然后将title() 用于没有任何数字的子字符串? @和平詹姆斯
【解决方案3】:

python中有一个模块叫做re(Regular expression),它使我们能够解决这些类型的答案。试试这段代码:

import re
    x="12 abc"
    m=""
    for i in x:
        if i.isalpha():
            m=i
            break
    m=m.upper()
    q=re.sub(" [a-z]",m,x,1)
    print(q)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2020-07-28
    • 2022-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多