我在列表列表中计算多个范围时遇到一些困难。 以下是我的尝试:
import numpy as np
k=[[0.0234,0.131,0.475,0.393,0.620],[0.0234,0.131,0.475,0.393,0.620]]
tak=[]
def thresh(a,b):
for x in k:
m=[val for val in x if a<=val<=b]
tak.append(m)
return tak
t1=np.arange(0.1,0.4,0.1)
for x in t1:
t2=thresh(x,0.5)
print t2
Output obtained:[[0.131, 0.475, 0.393], [0.131, 0.475, 0.393], [0.475, 0.393], [0.475, 0.393], [0.475, 0.393], [0.475, 0.393], [0.475], [0.475]]
Desired Output:[[[0.131, 0.475, 0.393],[0.475, 0.393],[0.475, 0.393],[0.475]],[[0.131, 0.475, 0.393],[0.475, 0.393],[0.475, 0.393],[0.475]]]
代码中的问题是,它同时计算两个列表的范围,而不是一次处理一个列表。
有关如何解决此问题的任何建议?谢谢。
答案 0 :(得分:2)
您的循环评估顺序不正确。您需要确保迭代的内容和顺序,因为它最终会影响您的输出结构。
以下是订单修正后的可能实施方法
k=[[0.0234,0.131,0.475,0.393,0.620],[0.0234,0.131,0.475,0.393,0.620]]
t1=np.arange(0.1,0.4,0.1)
def thresh(k, start, end):
for x in k:
yield [[val for val in x if s<=val<=end] for s in start]
list(thresh(k, t1,0.5))
[[[0.131, 0.475, 0.393], [0.475, 0.393], [0.475, 0.393], [0.475]], [[0.131, 0.475, 0.393], [0.475, 0.393], [0.475, 0.393], [0.475]]]
答案 1 :(得分:1)
你按错误的顺序循环,得到了你想要的结果,你必须按子列表应用阈值:
def thresh(lst, a,b):
return [val for val in lst if a<=val<=b]
def apply_tresh(lst, starts, stop):
rv = []
for sublst in lst:
sublv = []
for start in starts:
sublv.append(thresh(sublst, start, stop))
rv.append(sublv)
return rv
演示:
>>> apply_tresh(k, np.arange(0.1,0.4,0.1), 0.5)
[[[0.131, 0.475, 0.393], [0.475, 0.393], [0.475, 0.393], [0.475]], [[0.131, 0.475, 0.393], [0.475, 0.393], [0.475, 0.393], [0.475]]]
答案 2 :(得分:0)
好吧,它看起来像它按预期工作。 thresh函数将k列表的成员过滤为[a,b]中的成员。所以
x = 0.1;仅包括0.1到0.5之间的数字
[[0.131,0.475,0.393], [0.131,0.475,0.393]]
x=0.2:[[ 0.475, 0.393], [0.475,0.393]]
等等。
我无法告诉你如何得到你想要的输出。