我有这个清单:
data = [[0.0322249406353, 1.00005691884],
[0.0322267803497, 0.999999986608],
[0.0322286200641, 0.499997756763],
[0.0322304597785, 0.333330346815],
[0.0322322994929, 0.249996641841],
[0.0322341392073, 0.199996418857],
[0.0322359789217, 0.166662936867],
[0.0322378186361, 0.142853306874],
[0.0322396583505, 0.12499608438],
[0.032241498065, 0.111107133551],
[0.0322433377794, 0.0999959728877],
[0.0322451774938, 0.0909050232541],
[0.0322470172082, 0.0833292318929],
[0.0322488569226, 0.0769189468948],
[0.032250696637, 0.0714244168966],
[0.032350696637, 0.],
[0.032450696637, -0.04]]
因为我以后会使用它而我不想使用包含特定范围内的许多信息的列表,而其他数据中的稀缺信息我想过滤我的原始列表,以便我最终得到一个列表,其中连续值data[i][1]
(第二列)的距离大于给定值,比如0.05
,如果它们在[0,1]范围内。
data是第二列值连续减少的列表,因此data[i][1] < data[i-1][1]
。
所以我想要的列表是这样的:
data2 = [[0.0322249406353, 1.00005691884],
[0.0322267803497, 0.999999986608],
[0.0322286200641, 0.499997756763],
[0.0322304597785, 0.333330346815],
[0.0322322994929, 0.249996641841],
[0.0322378186361, 0.142853306874],
[0.032350696637, 0.],
[0.032450696637, -0.04]]
有什么想法可以做到这一点?感谢
编辑(第一次尝试):
data2=[]
for i in xrange(0,len(data)):
if 0>data[i][1] or data[i][1]>1:
data2.append([data[i][0],data[i][1]])
for j in xrange(0,len(data)):
if j>i and 0<data[i][1]<1 and 0<data[j][1]<1:
if data[i][1] - data[j][1] > 0.05:
data2.append([data[i][0],data[i][1]])
i = j
break
这部分起作用,因为我得到了一个不完整且不正确的新列表:
data2=[[0.0322267803497, 0.999999986608], [0.0322286200641, 0.499997756763], [0.0322304597785, 0.333330346815], [0.0322322994929, 0.249996641841], [0.0322341392073, 0.199996418857], [0.0322359789217, 0.166662936867], [0.0322378186361, 0.142853306874], [0.0322396583505, 0.12499608438], [0.032450696637, -0.04]]
答案 0 :(得分:1)
以下是一些提示:
编辑:
使用for循环是正确的策略,虽然这里不需要嵌套。如果新列表大于1
或更小0
,您只需将新值添加到新列表即可。对于每个其他元素,如果结果列表中当前最后一个元素与要检查的当前元素之间的差异在边界内或不在边界之间,则只需检查新生成的列表,然后添加或忽略它。
编辑2:
这是一个可能的解决方案:
data2=[]
limit=0.1
j = 0
# get all values > 1 in the result list
while data[j][1] > 1:
data2.append(data[j])
j = j + 1
# the next one too
data2.append(data[j])
for i in xrange(0,len(data)):
# compare current to last in results and see if it is smaller than the limit
if abs(data[i][1] - data2[len(data2)-1][1]) > limit and data[i][1] > 0:
data2.append(data[i])
j = i
# in the end add all the elements < 0
for i in xrange(0,len(data)):
if data[i][1] < 0:
data2.append(data[i])
答案 1 :(得分:0)
您应该制作生成器来过滤您的列表。下面是仅获取列表编号为第一个的使用示例:
l = [ [0,1], [1,2], [2,3], [3,4] ]
def get_first_divisible_by_2(l):
for i,j in l:
if not i % 2:
yield i,j
[ c for c in get_first_divisible_by_2(l) ]
[(0, 1), (2, 4)]
或生成器理解:
list( ( (i,j) for i,j in l if not i % 2 ) )
[(0, 1), (2, 4)]
只需使用您的过滤器进行调整,并使用coroutines,您就可以轻松处理以前的结果。