Python 数字列表转换为字符串不正确
出于某种原因,当我运行这段代码时...
def encode():
result2 = []
print result
for x in result:
result2 += str(x)
print result2
我得到的结果是...
[123, 456, 789]
['1', '2', '3', '4', '5', '6', '7', '8', '9']
我该怎么做才能让它返回 ['123', '456', '789']
呢?
谢谢!
4 个回答
2
问题在于,当你在列表上使用 +=
时,它希望你在操作符另一边放的是一个列表或者其他可以遍历的东西。所以你可以这样做:
>>> def encode():
... result2 = []
... print result
... for x in result:
... result2 += [str(x)]
... print result2
...
>>> result = [123, 456, 789]
>>> encode()
[123, 456, 789]
['123', '456', '789']
但是当你这样做时:
result2 += str(x)
Python 会认为你是想把 str(x)
的结果当作一个可以遍历的东西来处理,因此在扩展 result2
之前,它实际上会把这个字符串转换成一个字符列表,就像下面这个例子:
>>> [list(str(x)) for x in result]
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]
正如 NullUserException 所建议的,快速转换列表中的项目的方法是使用列表推导式。在这种情况下,只需去掉上面那个 list
的调用。
*更准确地说,它把 str(x)
的结果转换成一个迭代器(就像调用 iter()
一样——或者,正如 eryksun 指出的,通过调用对应的 C API 函数 PyObject_GetIter,不过这只适用于 cpython)。由于遍历字符串实际上是遍历字符串中的每个字符,所以每个字符都会被单独添加到列表中。
3
一种常用的方法是用 list(map(str, lst))
这个写法:
lst = [123, 456, 789]
res = list(map(str, lst))
print(res)
# ['123', '456', '789']
这种方法的性能比用列表推导式稍微好一点。
12
这样做怎么样:
result2 = [str(x) for x in result]
你得到这个结果的原因是因为 +=
在这里是用来连接列表的。因为 str(123)
的结果是 '123'
,可以看作是 ['1', '2', '3']
,当你把它和一个空列表连接起来时,你就得到了 ['1', '2', '3']
(其他值也是一样的道理)。
如果你想按照你自己的方式来实现这个功能,你需要:
result2.append(str(x)) # instead of result2 += str(x)