如何从给定过滤条件的python中的列表中提取元素

时间:2014-06-12 18:28:10

标签: python list filtering

我有这个清单:

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]]

2 个答案:

答案 0 :(得分:1)

以下是一些提示:

  • 显然,您希望逐个浏览数据结构,检查每个元素的谓词 ,那么什么样的循环可以帮助您呢?
  • 对于要将下一个元素与前一个元素进行比较的每个元素,并检查两个元素之间的差异是否大于特定值,那么你怎么能谓词看起来像?
  • 最后但并非最不重要的是,如果您的谓词返回true,您想对项目做什么?

编辑:

使用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,您就可以轻松处理以前的结果。