比较dict值并弹出键

2024-09-30 03:26:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本大字典,它看起来像这样:

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,但是…)


Tags: andoftokeyinfor标准value
2条回答

您可以创建一个新字典,只在其中添加将保留的元素,而不是使用要删除的元素列表。你知道吗

在初始阶段,我并没有找到降低O(n^2)复杂度的方法(将每个元素与其他元素进行比较),但是如上所述,排序会有所帮助。你知道吗

另外,我认为您将从dictionary中的条目生成两个不同的列表,其中包含相同的内容(每个为一个列表)。与“将每个项目与其他项目进行比较”相比,这不应该算太多,但仍然有帮助。你知道吗

所以沿着最初的,可能是最明显的解决方案(algo1),我写了第二个解决方案(algo2):

  • 从dict创建元组列表
  • 命令它(从而将比较减少到只有2个)。你知道吗
  • 切片(从而将比较从n^2减少到(n^2+n)/2->;n越大,优势越大
  • 在同一个循环中弹出。你知道吗

def algo1(a_dict):
    to_remove = []
    for ilcs, iloads in a_dict.items():
        for jlcs, jloads in a_dict.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:
        a_dict.pop(i)
    return a_dict

def algo2(a_dict):
    ordered_list_view = sorted(a_dict.items(), key=lambda t: abs(t[1][2]))
    for i, ikv in enumerate(ordered_list_view):
        forward_slice = ordered_list_view[i:]
        for j, jkv in enumerate(forward_slice):
            if all(ikv[1][j] > jkv[1][j] for j in range(2)):
                print(ikv[1], jkv[1])
                a_dict.pop(ikv[0])
                break
    return a_dict

我也给它们计时,但令我惊讶的是,algo1速度更快。有点,但还是。。你知道吗

相关问题 更多 >

    热门问题