【问题标题】:Why str(reversed(...)) doesn't give me the reversed string?为什么 str(reversed(...)) 不给我反转的字符串?
【发布时间】:2015-04-22 08:35:08
【问题描述】:

我正在尝试习惯迭代器。为什么如果我输入

b = list(reversed([1,2,3,4,5]))

它会给我一个颠倒的列表,但是

c = str(reversed('abcde'))

不会给我一个反转的字符串吗?

【问题讨论】:

  • 您需要遍历反转的对象,这就是您通过在其上调用 list 来执行的操作,str(reversed('abcde')) 会将对象作为与str([]) 等相同的字符串提供给您。确实
  • 请仔细检查您的问题,看看是否有值得接受的答案(如本主题中的答案)。

标签: python string list iterator


【解决方案1】:

在 Python 中,reversed 实际上返回一个反向迭代器。所以,list 应用在迭代器上会给你列表对象。

在第一种情况下,输入也是一个列表,因此 list 应用于 reversed 迭代器的结果对您来说似乎很合适。

在第二种情况下,str 应用于返回的迭代器对象实际上会给你它的字符串表示形式。

相反,您需要迭代迭代器中的值并使用str.join 函数将它们全部连接起来,就像这样

>>> ''.join(reversed('abcde'))
edcba

【讨论】:

  • 谢谢 我不确定字符串表示与字符串是什么?是否使用 join 工作,因为它正在遍历反转的字符串来重建它(请原谅我的术语不好),而 str() 没有这样做?
  • Str 会尝试将对象转换为字符串。由于反向迭代器是一个对象,因此会尝试将其转换为字符串。但是 join 迭代迭代器并使用迭代器中的所有字符串构建一个新字符串
  • 谢谢,所以 str() 不会像 list 那样迭代来构建一个新字符串。 str() 如何构建或隐藏字符串?由于字符串是不可变的,而列表是可变的,所以 str() 不能以相同的方式重建字符串
  • Str 内部调用__str__ 魔术方法来获取字符串表示形式。
【解决方案2】:

扩展切片方法的另一种方式。 more details

>>> a = "abcde"
>>> a[::-1]
'edcba'
>>> 

按字符串列出 --> 反向列表 --> 加入列表

>>> a
'abcde'
>>> b = list(a)
>>> b
['a', 'b', 'c', 'd', 'e']
>>> b.reverse()
>>> b
['e', 'd', 'c', 'b', 'a']
>>> "".join(b)
'edcba'
>>> 

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 2020-11-17
    • 2015-07-06
    • 2021-12-08
    • 2021-06-27
    • 2016-08-22
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多