我是新的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中,你应该寻找新的对象,而不是修改现有的对象。