我有100个OrderedDicts,比如,
foo = OrderedDict({
'a': -0.1011,
'b': 3.2022,
'c': 0.0
})
其中一些可能是平等的。对于像foo
这样的100个词组的列表,我想找到唯一项的索引,如果给定项的值不等于任何其他词典的值,则给定项是唯一的,容差为0.01 。重要的是,我们可以假设列表中所有OrderedDicts的键的顺序是相同的。所以我可以做np.isclose(foo.values(), baz.values(), atol=0.01)
,但是我必须循环10000次才能比较它们;实际上,我可以在飞行中忽略那些被发现冗余的b / c。但有没有更有效的方法来做到这一点?
另一种方法是:uniques = {tuple(x.values()) for x in list_of_ord_dicts}
,但我怎么能在这里加入公差?
答案 0 :(得分:0)
这可能是矫枉过正但它应该运行得很快并且易于阅读。它运行K-Means算法以在.01内查找聚类。你需要sklearn。
from collections import OrderedDict
from random import random
from copy import copy
import pandas as pd
from sklearn import cluster
hundred_dicts = [OrderedDict(a=random(), b=random(), c=random()) for _ in range(90)]
hundred_dicts.extend(copy(hundred_dicts[:10]))
df = pd.DataFrame(hundred_dicts)
kmeans = cluster.KMeans(
n_clusters=len(hundred_dicts),
random_state=0,
tol=0.01).fit(df)
labels = kmeans.labels_
df['cluster'] = kmeans.labels_
df = df.drop_duplicates(subset='cluster')
答案 1 :(得分:0)
如果stuff
是dicts列表,我希望我的容差为d
小数:
import numpy as np
_, ind = np.unique(np.array([np.round(s.values(), d) for s in stuff]), axis=0, return_index=True)
其中ind
是引用唯一字母的stuff
的索引。