根据字典键和列表之间的匹配来更改字典值

时间:2020-03-23 11:17:08

标签: python list dictionary

我想根据不等于条件向字典提供十六进制颜色代码。我有以下数据:

my_list = [1,3,5]
my_dict = {0 : '#a2bd62', 1 : '#9930ad', 2 : '#41c65d', 3 : '#9359d9', 4 : '#4667e6', 5 : '#c95eda'}

现在,对于不在my_list中的所有字典键,我希望该特定键/值对的值是:'#A9A9A9'

我当前的解决方案是遍历列表中的所有项目,然后遍历所有键,但是该解决方案存在缺陷,因为我的字典中的所有值最终都是'#A9A9A9'

for item in my_list:
    for key,value  in my_dict.items():
        if item != key:
            my_dict[key] = '#A9A9A9'

有人能够提供解决方案吗?

3 个答案:

答案 0 :(得分:1)

您应该首先遍历my_dict.items()而不是my_list,请注意,您只想检查给定键是否为列表中的in(使用in运算符! )

所以这是使用字典理解的一种方法:

my_set = set([1,3,5])
my_dict = {0 : '#a2bd62', 1 : '#9930ad', 2 : '#41c65d', 3 : '#9359d9', 
           4 : '#4667e6', 5 : '#c95eda'}

{k:v if k in my_set else '#A9A9A9' for k,v in my_dict.items()}
# {0: '#A9A9A9', 1: '#9930ad', 2: '#A9A9A9', 3: '#9359d9', 4: '#A9A9A9', 5: '#c95eda'}

或使用常规的for循环:

d = {}
for k,v in my_dict.items():
    if k in my_set:
        d[k] = v
    else:
        d[k] = '#A9A9A9'

答案 1 :(得分:1)

您可以在键和my_list之间进行设置区别:

my_list = [1,3,5]
my_dict = {0 : '#a2bd62', 1 : '#9930ad', 2 : '#41c65d', 3 : '#9359d9', 4 : '#4667e6', 5 : '#c95eda'}
val = '#A9A9A9'

for k in set(my_dict.keys()).difference(my_list):
    my_dict[k] = val

这是O(M)时间复杂度方法(其中M是my_lsit中不在的键的数量),比从列表{ {1}}

答案 2 :(得分:0)

这项工作:

select t.id, v.*
from t cross apply
     (values ('Req 1', Req1, Req1Comment),
             ('Req 2', Req2, Req2Comment),
             . . .
     ) v(requirement, status, comments);