【问题标题】:how to extract elements from a list in python given filter criterion如何从给定过滤条件的python列表中提取元素
【发布时间】:2014-06-13 05:53:59
【问题描述】:

我有这个清单:

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

【问题讨论】:

  • @jpcgandre 请澄清,对于数据中的每个列表,仅当 0 &lt; data[i][1] &lt; 1 and 0 &lt; data[i+1][1] &lt; 1 and data[i][1] - data[i+1][1] &gt; 0.05 时才满足条件??
  • 是的,就是这样。

标签: python list filtering


【解决方案1】:

这里有一些提示:

  • 显然,您想逐个检查数据结构,检查每个元素 for 的谓词,那么什么样的循环可以帮助您?
  • 对于每个元素,您希望将下一个元素与前一个元素进行比较,并检查两个元素之间的 差异 是否大于特定值,那么您的谓词看起来像?
  • 最后但并非最不重要的一点是,如果您的谓词返回 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])

【讨论】:

    【解决方案2】:

    您应该制作生成器来过滤您的列表。下面是一个仅获取具有一对编号的列表的用法示例:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      相关资源
      最近更新 更多