Python 数字列表转换为字符串不正确

9 投票
4 回答
21932 浏览
提问于 2025-04-16 22:56

出于某种原因,当我运行这段代码时...

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)

撰写回答