我有一些清单清单。每个列表的长度和深度都以不可预测的方式变化。我想对每个底部元素应用一个函数。出于这个问题的目的,我们可以说我只需要将每个int转换为float。
我搜索了该站点并发现了这个:Python: How to loop a list of lists of varying depth?
但是,当将其适应我的问题时,它成功访问了每个元素,但似乎并没有改变实际值。最后,当我想要浮点数列表时,我仍然有一个int列表。
def list_flatten(my_list):
for item in my_list:
if(isinstance(item,list)):
list_flatten(item)
else:
item = float(item)
return my_list
problem = [[[[1,1],[2,2],[3,3]],[[4,4],[5,5],[6,6]],[[7,7],[[8,8],[9,9]]]]]
print(list_flatten(problem))
答案 0 :(得分:1)
这是因为,在以下情况中:
for item in some_list:
item = some_function(item)
..您只是将item
重新分配为一个新值。您没有更改列表中的实际元素。
代码中的另一个问题是,您对list_flatten(..)递归调用返回的结果不做任何事情。它不会神奇地适合结果数组中-您可能需要使用列表对象上的+=
运算符来完成它。
这是您代码的有效版本:
def list_flatten(my_list):
res = []
for item in my_list:
if isinstance(item,list):
res += list_flatten(item)
else:
res.append(float(item))
return res
答案 1 :(得分:1)
您快到了,但是原始列表项从未转换过。考虑一下:
def list_flatten(my_list_or_value):
if isinstance(my_list_or_value,list):
return [list_flatten(sublist) for sublist in my_list_or_value]
return float(my_list_or_value)
problem = [[[[1,1],[2,2],[3,3]],[[4,4],[5,5],[6,6]],[[7,7],[[8,8],[9,9]]]]]
print(list_flatten(problem))
-遍历任何项目或子项目,并且仅当您处于最深层时才返回float(x)
。
答案 2 :(得分:0)
这是一个适用于任何序列类型的版本。它将返回与旧序列相同类型的新序列:
from collections.abc import Sequence
def nested_convert(sequence, func):
cls = type(sequence)
return cls(nested_convert(subseq, func) if isinstance(subseq, Sequence)
else func(subseq) for subseq in sequence)
l = [((1, 2, 3), [5, 6, (2, 3)]), (3, 4, 5, [4, 5, 6])]
print(nested_convert(l, lambda x: x*2))
# [((2, 4, 6), [10, 12, (4, 6)]), (6, 8, 10, [8, 10, 12])]
答案 3 :(得分:0)
对于遍历实际的整数元素,您已经有了正确的想法,但是似乎错过了了解如何修改它们的想法。如果您不熟悉编程,欢迎参加“参考”与“值”的第一课。
举一个简单的例子:
arr = [1,2,3,4]
for el in arr:
el = float(el)
print el
print arr
# this will print
1.0
2.0
3.0
4.0
[1,2,3,4]
这是因为,当您遍历列表时,变量el
将采用arr
中每个元素的“值”,而不是实际“引用”元素本身-可以将值视为值所在的内存位置。因此,您对el
的修改是“有效的”,但仅在el
上进行-数组中值的副本-而不是数组本身。
如果我们将代码更改为此,则可以修改数组本身,而不是使用局部变量el
:
arr = [1,2,3,4]
for i in range(len(arr)):
arr[i] = float(arr[i])
print arr[i]
print arr
# this will print
1.0
2.0
3.0
4.0
[1.0,2.0,3.0,4.0]
您可以通过四处搜索“按引用传递与按值传递”和“指针”之类的内容来查找有关此概念的更多信息。这可能会造成一些混乱,尤其是如果您仅熟悉python并且以前没有看过C / C ++或曾经使用过C / C ++的话-这些差异非常明确的语言会迫使您及早学习它们。祝你好运:)