根据条件修改列表元素



我是新的Python,但有C/c++背景。我试图修改一个满足条件的2D列表(列表的列表)元素。我所能想到的是以下解决方案:

tsdata = [[random.random() for x in range(5)] for y in range(5)]
def check(tsdata):
    for i in range(len(tsdata)):
        for j in range(len(tsdata[i])):
            if (tsdata[i][j] < min_value) or (tsdata[i][j]> max_value):
                tsdata[i][j] = 0
check(tsdata)

我确信有一个更好的解决方案,实际上是适合Python的,但我想不出任何其他的实际工作。

编辑:实际上,列表tsdata是一个函数参数,我试图修改它,所以你的一些答案不工作。我已经编辑了代码,所以这是清楚的。

如果你想处理大数组,你可能想使用numpy。除了更高效之外,我认为代码更容易阅读:

from numpy import random
tsdata = random.random((5, 5))
tsdata[tsdata < min_value] = 0
tsdata[tsdata > max_value] = 0

欢迎来到语句简洁紧凑的世界。

tsdata_mod = [[0 if (x < min_value or x > max_value) else x for x in y] for y in tsdata]

或在功能模式下:

def check(my_list):
    my_list_mod = [[0 if (x < min_value or x > max_value) else x for x in y] for y in tsdata]
    return my_list_mod
tsdata_mod = check(tsdata)

在我看来,这是一个非常"python"的方式来完成这个任务。


同样,当循环遍历容器(例如列表)时,你不能这样做:

for i in range(len(tsdata)):
    for j in range(len(tsdata[i])):
        # do something with "tsdata[i]","tsdata[i][j]"

而是:

for sublist in tsdata:
    for entry in sublist:
        # do something with "sublist", "entry"

如果你真的需要索引(在你的情况下,你不需要),你使用enumerate()函数,像这样:

for i_sub, sublist in enumerate(tsdata):
    for i_entry, entry in enumerate(sublist):
        # do something with "i_sub", "sublist", "i_entry", "entry"

您的解决方案不错,但下面的内容可能更容易理解。(取决于你的代码应该如何发展)

def new_value(value):
    """Encapsulation of the core treatment"""
    return 0 if (value < min_value) or (value > max_value) else value
new_tsdata = [[new_value(value) for value in row] for row in ts_data]

在python中,你应该寻找新的对象,而不是修改现有的对象。

最新更新