Python 根据条件修改列表元素

Python 根据条件修改列表元素,python,list,Python,List,我是Python新手,但有C/C++背景。 我试图修改满足条件的二维列表(列表列表)元素。 我所能想到的是以下解决方案: 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] <

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

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)
tsdata=[[random.random()表示范围(5)中的x]表示范围(5)中的y]
def检查(tsdata):
对于范围内的i(len(tsdata)):
对于范围内的j(len(tsdata[i]):
如果(tsdata[i][j]<最小值)或(tsdata[i][j]>最大值):
tsdata[i][j]=0
检查(tsdata)
我确信有一个更好的解决方案,它实际上适用于Python,但我想不出任何其他实际可行的方法


编辑:事实上,list tsdata是一个函数参数,我正在尝试修改它,以使您的一些答案不起作用。我对代码进行了编辑,使其清晰明了。

欢迎来到简洁简洁的世界

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

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"

欢迎来到简洁简洁的世界

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

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新值(值):
“”“核心处理的封装”“”
如果(值<最小值)或(值>最大值)为其他值,则返回0
new_tsdata=[[new_value(value)表示行中的值]表示ts_data中的行]

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

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

def新值(值):
“”“核心处理的封装”“”
如果(值<最小值)或(值>最大值)为其他值,则返回0
new_tsdata=[[new_value(value)表示行中的值]表示ts_data中的行]

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

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

from numpy import random
tsdata = random.random((5, 5))
tsdata[tsdata < min_value] = 0
tsdata[tsdata > max_value] = 0
从numpy导入随机
tsdata=random.random((5,5))
tsdata[tsdatamax_值]=0

如果要处理大型阵列,可能需要使用
numpy
。除了效率更高之外,我认为代码更容易阅读:

from numpy import random
tsdata = random.random((5, 5))
tsdata[tsdata < min_value] = 0
tsdata[tsdata > max_value] = 0
从numpy导入随机
tsdata=random.random((5,5))
tsdata[tsdatamax_值]=0


更简单:
x if min\u value谢谢,但我实际上是想在函数中修改这个列表tsdata,所以这不起作用。@OthmanNejjar这是什么意思?你能更新这个问题吗?你的函数不返回任何东西,当然你可以使用函数的列表理解。你的建议是,最好返回一个新对象,而不是实际修改列表本身?我试着做后一个更简单的:
x if min_value谢谢,但我实际上是想在函数中修改这个列表tsdata,所以这不起作用。@OthmanNejjar这是什么意思?你能更新这个问题吗?你的函数不返回任何东西,当然你可以使用函数的列表理解。你的建议是,最好返回一个新对象,而不是实际修改列表本身?我想做最后一件事为什么你最后一句话?的确,这个列表理解比修改列表所需的嵌套循环更简单,但这是一个普遍的事实吗?一般来说,我更喜欢阅读更简单的列表理解。她是一个成功的标杆。在修改对象的情况下,我经常看到性能提高。谢谢。我已经编辑了最初的问题。我正在修改函数中的一个列表参数,因此无法处理新对象。。。还是这种做法不好?如答案所示,复制而不是修改对象总是可能的。在我看来,这是一个更好的方法,因为你的函数没有副作用,这是一个非常有用的属性。好的,我会选择这个解决方案。谢谢;)为什么你最后的陈述?的确,这个列表理解比修改列表所需的嵌套循环更简单,但这是一个普遍的事实吗?一般来说,我更喜欢阅读更简单的列表理解。她是一个成功的标杆。在修改对象的情况下,我经常看到性能提高。谢谢。我已经编辑了最初的问题。我正在修改函数中的一个列表参数,因此无法处理新对象。。。还是这种做法不好?如答案所示,复制而不是修改对象总是可能的。在我看来,这是一个更好的方法,因为你的函数没有副作用,这是一个非常有用的属性。好的,我会选择这个解决方案。谢谢;)谢谢你的提示,我会调查的谢谢你的提示,我会调查的