我有一本大字典,它看起来像这样:
my_dict = {'a': [-33.27, -2.12, 5.23], 'b': [-57.11, 9.82, -26.13], ...}
所以键是字符串,值是浮动列表。
我想做的是通过运行一个标准来减少它的大小,这个标准可以找到并删除一些冗余的key:value对。你知道吗
伪码中的标准是:
对于每个键i,找出dict中是否存在不同的键j:
value_of_key_i[0] > value_of_key_j[0] and
value_of_key_i[1] > value_of_key_j[1] and
abs(value_of_key_i[2]) < abs(value_of_key_j[2])
我为这个任务写的是:
to_remove = []
for ilcs, iloads in running_load.items():
for jlcs, jloads in running_load.items():
if iloads[0] > jloads[0] and iloads[1] > jloads[1] and abs(iloads[2]) < abs(jloads[2]):
# print(iloads, jloads)
to_remove.append(ilcs)
break
for i in to_remove:
running_load.pop(i)
这确实有效,但是显式地遍历dict两次,并且弹出所需的额外for循环感觉效率低下。。你知道吗
有更好的办法吗?使用生成器和any()
这样做会更有效吗?你知道吗
注:我的方法的另一个问题是它不能测试相等性,因为在某个点上,这些值将被测试为针对它们自己(是的,人们可以检查它和continue
,但是…)
您可以创建一个新字典,只在其中添加将保留的元素,而不是使用要删除的元素列表。你知道吗
在初始阶段,我并没有找到降低O(n^2)复杂度的方法(将每个元素与其他元素进行比较),但是如上所述,排序会有所帮助。你知道吗
另外,我认为您将从dictionary中的条目生成两个不同的列表,其中包含相同的内容(每个为一个列表)。与“将每个项目与其他项目进行比较”相比,这不应该算太多,但仍然有帮助。你知道吗
所以沿着最初的,可能是最明显的解决方案(algo1),我写了第二个解决方案(algo2):
我也给它们计时,但令我惊讶的是,algo1速度更快。有点,但还是。。你知道吗
相关问题 更多 >
编程相关推荐