我希望对Python中另一个列表中的列表的每个条目进行类型转换。
我知道map
适用于这些类型的案例:
list = map(int, list)
但这并不是这样的工作案例:
for entry in list:
entry = map(int, entry)
这些条目在循环中是类型转换,但是当循环结束时,不知何故,每个条目都会恢复为原始类型。
说我有这样一个列表:[1, 2, 3, 4]
。我可以将每个条目转换为这样的字符串:new_list = map(str, [1, 2, 3, 4])
给我['1', '2', '3', '4']
。但这不适用于另一个列表中的列表。 [ [1, 2], [3, 4] ]
使用相同的方法无法转换为字符串。
答案 0 :(得分:1)
您需要将map返回的输出转换为python3中的列表。
>>> s = [[1, 2, 3, 4], [1, 2, 3, 4]]
>>> [list(map(str,i)) for i in s]
[['1', '2', '3', '4'], ['1', '2', '3', '4']]
答案 1 :(得分:1)
当您使用for
循环时,list
中的条目值将复制到变量entry
,因此更改条目将不起作用。
上述语句的意思是,假设list
是一组内存位置,每个内存位置包含一个pointer
对象,在上面的例子中是另一个list
。当你这样做 -
for entry in list:
条目将是一个全新的内存地址,它仍然包含与pointer
中对象相同的list
。但是当你这样做的时候 -
entry = map(int, entry)
您正在更改新内存地址(而不是列表中的内容)以指向其他位置,这不会导致原始列表条目发生更改。
让我们举一个简单的lst
数字列表示例,然后我们尝试下面的代码 -
lst = [1,2,3,4]
for n in lst:
n = 1
最后,如果您打印lst
,它仍然是[1,2,3,4]
。
另外,假设你不能使用下面的内容,因为你有一个列表列表,lst
是你的变量 -
lst = list(map(lst))
你应该尝试像 -
这样的东西for idx, entry in enumerate(list):
list[idx] = list(map(int, entry))
请注意,您不应该使用list
作为变量名称,因为它是lists
答案 2 :(得分:1)
您的尝试失败,因为您正在更改循环变量的值而不是列表的值。
要解决您的问题,您可以将地图嵌套在另一个地图声明中。
>>> l = [[1, 2], [3, 4]]
>>> map(lambda x: map(str,x),l )
[['1', '2'], ['3', '4']]
然而,在这种情况下,列表理解会更好
>>> [[str(j) for j in i ]for i in l]
[['1', '2'], ['3', '4']]
答案 3 :(得分:1)
看起来你可能得到任何数据格式,有时是单维数组与双维数或甚至更多嵌套列表,无论你得到一个简单的列表还是高度嵌套的列表,你都想转换它们。请尝试以下方法:
def convert_to_str(items):
return [convert_to_str(s) if isinstance(s, list) else str(s) for s in items ]
它适用于所有这些场景。例如:
print(convert_to_str([1, 2, 3, 4]))
print(convert_to_str([[1,2], [3,4]]))
print(convert_to_str([[1,2, [3, 4, [5, [6, 'String!!']]]], [3,4]]))
会给你以下内容:
['1', '2', '3', '4']
[['1', '2'], ['3', '4']]
[['1', '2', ['3', '4', ['5', ['6', 'String!!']]]], ['3', '4']]
如果您不喜欢使用函数但宁愿使用lambda,那么请尝试使用convert_strings
替换:
convert_strings = lambda items: [convert_to_str(s) if isinstance(s, list) else str(s) for s in items ]
答案 4 :(得分:0)
你能做的是:
for entry in list:
entry[:] = map(int, entry)
或者:
list = map(lambda l: map(int, l), list)
或者:
list = [[int(n) for n in l] for l in list]
至于为什么这些有效,但你的却没有,你应该阅读Python的执行模型: