所以我有一个列表,其中大约有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。
很抱歉,如果我不能更好地解释这一点,如果你帮助我,第一部分已经是一个很好的帮助。谢谢你们。
答案 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)
如果订单很重要,请使用groupby
(doc):
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']
答案 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()