如何使用列表推导来反转字符串

时间:2014-02-20 07:34:44

标签: python string

这里我尝试使用以下逻辑来反转字符串,

st = "This is Ok"
rst = list(st)
rst.reverse()
''.join(s for s in rst)

工作正常,但当我尝试遵循以下逻辑时,我收到错误,

st = "This is Ok"
''.join(s for s in list(st).reverse())

这是一个错误,

----> 1 ''.join(s for s in list(st).reverse())

TypeError: 'NoneType' object is not iterable

请任何人解释上述过程。

4 个答案:

答案 0 :(得分:8)

list.reverse是一个就地操作,因此它会更改列表并返回None。你应该使用reversed函数,就像这样

"".join(reversed(rst))

我个人建议像这样使用slicing notation

rst[::-1]

例如,

rst = "cabbage"
print "".join(reversed(rst))   # egabbac
print rst[::-1]                # egabbac

答案 1 :(得分:3)

您是否尝试过以下操作?

"".join(s for s in reversed(st))

reversed返回一个反向迭代器。 Documentation is here

答案 2 :(得分:3)

失败是因为lst.reverse()反转列表并返回None(并且您无法迭代None)。你正在寻找的是(例如)reversed(lst),它会从lst中创建一个新的列表,而这个列表是相反的。

请注意,如果要反转字符串,则可以直接执行此操作(不使用列表):

>>> st = "This is Ok"
>>> st[::-1]
"kO si sihT"

答案 3 :(得分:0)

你试试这个吗?

[x for x in a[::-1]]

[x for x in reversed(a)]

两者都运行良好,但使用[:: - 1]

效率更高
min(timeit.repeat(lambda: [x for x in a[::-1]]))

出[144]:0.7925415520003298

min(timeit.repeat(lambda: [x for x in reversed(a)]))

出[145]:0.854458618996432