python - 按列表顺序从dict值匹配列表项获取密钥

时间:2017-12-02 21:02:55

标签: python-3.x list dictionary key

我有这段代码:

d = {'h' : 11111111, 't' : 1010101, 'e' : 10101111, 'n' : 1}

my_list = [1010101, 11111111, 10101111, 1]

get_keys = [k for k, v in d.items() if v in my_list]

print(get_keys)

我得到的输出是:

['h', 't', 'e', 'n']

但是我希望按照my_list的顺序:

['t', 'h', 'e', 'n']

我该怎么做?谢谢!

2 个答案:

答案 0 :(得分:2)

给定(所有值也是唯一的):

>>> d = {'h' : 11111111, 't' : 1010101, 'e' : 10101111, 'n' : 1}
>>> my_list = [1010101, 11111111, 10101111, 1]

你可以反转字典:

>>> d_inverted={v:k for k,v in d.items()}

然后按预期编制索引:

>>> [d_inverted[e] for e in my_list]
['t', 'h', 'e', 'n']

适用于任何最新版本的Python。

请注意,您发布的方法的复杂度为O(n^2)。这意味着执行代码的时间将随着元素数量的平方而增加。 将元素加倍,使执行时间翻两番。结果不佳。

视觉上,看起来像这样:

enter image description here

相比之下,我发布的方法是O(n),或者仅与元素数量成比例。 将数据加倍是执行时间的两倍。更好的结果。 (但不如O(1)那么好,无论数据大小如何,都是相同的执行时间。)

如果你想让他们比较时间:

def bad(d,l):
    new_list = []

    for i in l:
        for key, value in d.items():
            if value == i:
                new_list.append(key)
    return new_list 

def better(d,l):
    d_inverted={v:k for k,v in d.items()}
    return [d_inverted[e] for e in my_list]

if __name__=='__main__':
    import timeit  
    import random 

    for tgt in (5,10,20,40,80,160,320,640,1280):
        d={chr(i):i for i in range(100,100+tgt)}
        my_list=list(d.values())
        random.shuffle(my_list)
        print("Case of {} elements:".format(len(my_list)))
        for f in (bad, better):
            print("\t{:10s}{:.4f} secs".format(f.__name__, timeit.timeit("f(d,my_list)", setup="from __main__ import f, d, my_list", number=100)))

打印:

Case of 5 elements:
    bad       0.0003 secs
    better    0.0001 secs
Case of 10 elements:
    bad       0.0006 secs
    better    0.0002 secs
Case of 20 elements:
    bad       0.0022 secs
    better    0.0003 secs
Case of 40 elements:
    bad       0.0071 secs
    better    0.0004 secs
Case of 80 elements:
    bad       0.0240 secs
    better    0.0008 secs
Case of 160 elements:
    bad       0.0912 secs
    better    0.0018 secs
Case of 320 elements:
    bad       0.3571 secs
    better    0.0032 secs
Case of 640 elements:
    bad       1.3704 secs
    better    0.0053 secs
Case of 1280 elements:
    bad       5.4443 secs
    better    0.0107 secs

您可以看到嵌套循环方法从3x开始较慢,并随着数据大小的增加而增加到500x。时间的增加跟踪Big O预测的内容。你可以想象数以百万计的元素会发生什么。

答案 1 :(得分:0)

$(document).ready(function () {
    $("#answer").keyup(function () {
        var text = $(this).val();
        var comparingText = "7";
        var valid = text == comparingText;

        $('#submitted')
          .toggleClass('btn-primary', valid)
          .toggleClass('btn-danger disabled', !valid);

    });
});