将函数应用于列表列表中的每个底部元素

时间:2018-10-29 01:12:02

标签: python

我有一些清单清单。每个列表的长度和深度都以不可预测的方式变化。我想对每个底部元素应用一个函数。出于这个问题的目的,我们可以说我只需要将每个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))

4 个答案:

答案 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 ++的话-这些差异非常明确的语言会迫使您及早学习它们。祝你好运:)