过滤Python列表以删除类似的值

时间:2014-04-14 18:06:54

标签: python

所以我有一个列表,其中大约有100个浮点值介于0和1之间,类似于:

[0.642918256477056,
 0.6429182558639024,
 0.6429182466700671,
 0.6429182068585415,
 0.6429180997884363,
 0.6428178743476422,
 0.6428174651415239,
 0.6428167927406518,
... ]

我需要的是一种创建更简单列表的方法,其中4位小数值相同的值被删除,只保留第一个。例如:数字0,6429 ...在原始列表中重复多次,我只需要一次。

在此之后,我仍然需要知道删除了哪些值(索引),以便我可以重新映射"他们。例如:

len(original_list) # Result: 100 | remap 0:1 range (index0 is 0, index 100 is 1)
len(filterted_list) # Result: 10

例如,如果filteres_list的索引5在original_list中是索引80,我需要知道原始重新映射的值是0.8。

很抱歉,如果我不能更好地解释这一点,如果你帮助我,第一部分已经是一个很好的帮助。谢谢你们。

6 个答案:

答案 0 :(得分:1)

一个集合被定义为唯一元素的无序集合列表。

如果订单不适合你,只需使用一套:

import math
filterted_list = set(round(x, 4) for x in original_list)

您还可以使用此收据实现简单的有序集:

http://code.activestate.com/recipes/576694/

会记住项目的插入顺序。

答案 1 :(得分:1)

使用简单的字典跟踪您所看到的内容。然后使用一个函数进行过滤,该函数在舍入到4个小数位后检查之前是否已经看过某些东西。

seen = {}

nums = [0.642918256477056,
 0.6429182558639024,
 0.6429182466700671,
 0.6429182068585415,
 0.6429180997884363,
 0.6428178743476422,
 0.6428174651415239,
 0.6428167927406518]

def filterFN(x):
   x = round(x, 4)
   if seen.get(x) == None:
      seen[x] = 1
      return True
   return False

filter(filterFN, nums)

答案 2 :(得分:1)

如果订单很重要,请使用groupbydoc):

from itertools import groupby, imap

l = [0.642918256477056,
     0.6429182558639024,
     0.6429182466700671,
     0.6429182068585415,
     0.6429180997884363,
     0.6428178743476422,
     0.6428174651415239,
     0.6428167927406518,]

print [x for x, _ in groupby(imap(lambda el: round(el, 4), l))]
>>> [0.6429, 0.6428]

答案 3 :(得分:0)

使用套装和圆形:

li=[0.642918256477056,
 0.6429182558639024,
 0.6429182466700671,
 0.6429182068585415,
 0.6429180997884363,
 0.6428178743476422,
 0.6428174651415239,
 0.6428167927406518]

seen=set()
data=[]
for n in li:
    nr=round(n,4)
    if nr not in seen:
        seen.add(nr)
        data.append(nr)   # append n if you want the unrounded value

print data 
# [0.6429, 0.6428]

您可以向data追加n(未接地)或nr舍入值。订单将保持不变。

答案 4 :(得分:0)

除了set之外,您还可以使用列表推导,如下所示:

d=[0.642918256477056,
 0.6429182558639024,
 0.6429182466700671,
 0.6429182068585415,
 0.6429180997884363,
 0.6428178743476422,
 0.6428174651415239,
 0.6428167927406518]
result=[]
[result.append('%.4f' % round(i, 4)) for i in d if '%.4f' % round(i, 4) not in result]
print result

输出:

['0.6429', '0.6428']
  1. 浏览个别元素
  2. 将元素舍入为4位小数
  3. 如果在结果列表
  4. 中找不到值,则添加到结果中

答案 5 :(得分:0)

使用python 2.7和numpy around函数,结果是一个字典,其中数字是键并为索引赋值

#!/usr/bin/env python

import numpy as np

def getData():
    data=[0.642918256477056,
     0.6429182558639024,
     0.6429182466700671,
     0.6429182068585415,
     0.6429180997884363,
     0.6428178743476422,
     0.6428174651415239,
     0.6428167927406518]
    return data




def main():
    index_data={}
    rounded_data=np.around(getData(),4)
    index=0
    for number in rounded_data:
        if not number in index_data:
            index_data[number]=[index]
        else:
            index_data[number].append(index)

        index+=1
    print index_data
if __name__=="__main__":
    main()