如何对三重嵌套列表映射函数并保持列表不变?
我正在为我的博士研究建立一个分析流程,使用了一个三层嵌套的列表来表示我的数据结构,因为我希望它能在第二层和第三层扩展到任意数量的数据。第一层是整个数据集,第二层是数据集中的每个主题,第三层是每个主题的每个测量的行。
[dataset]
|
[subject]
|
[measure1, measure2, measure3]
我想对每个测量应用一个函数,比如把所有的点转换成浮点数,或者把异常值替换成None,并希望根据嵌套结构返回整个数据集。但是我现在的代码:
for subject in dataset:
for measure in subject:
map(float, measure)
...结果是正确的,正是我想要的,但问题是我想不出如何高效地将结果重新赋值回数据集,或者不丢失嵌套的层级。理想情况下,我希望能*就地修改测量,但我想不出该怎么做。
你能建议一种高效且符合Python风格的方法吗?使用三层嵌套列表来组织我的数据是不是个傻主意?
4 个回答
2
这段代码应该能解决问题。
for subject in dataset:
for measure in subject:
for i, m in enumerate(measure):
measure[i] = float(m)
3
return [[map(float, measure) for measure in subject] for subject in dataset]
你可以返回一个新的列表,而不是直接在原来的列表上进行修改——这样做依然非常高效,并且保留了你想要的所有信息。(顺便说一下,实际上,这种方法通常比直接给列表的某个位置赋值要快[需要引用],这也是其他人这里提到的建议!)
14
与其在原来的列表上操作,不如新建一个列表。
dataset = [[[float(value) for value in measure]
for measure in subject]
for subject in dataset]