如果键是列表的子字符串,则创建新字典

Create new dictionary if key is substring of a list

我有以下列表和字典

lst = [
    'A_blue',
    'A_yellow',
    'A_green',
    'A_red',
    'B_blue',
    'B_yellow',
    'B_green',
    'B_red',
    'C_blue',
    'C_yellow',
    'C_green',
    'C_red'
]

dct = {'blue': 0.5, 'yellow': 0.1, 'green': 0.3, 'red': 0.8}

我想获取一个新字典,其中键是 lst 中的元素,如果键是 [=] 中元素的子字符串,则值是 dct 中的数字13=].
基本上输出是这样的:

{'A_blue': 0.5, 'A_yellow': 0.1, 'A_green': 0.3, 'A_red': 0.8, 'B_blue': 0.5, ...}

我尝试了几种方法,但只得到语法错误和其他错误;例如,

[v for k, v in dct.items() if k in e for e in lst]

给了我UnboundLocalError: local variable 'e' referenced before assignment,我明白了。
但是我没有设法找到解决方案,尽管应该没有那么困难。

此方法遍历 dct 中的所有键,并对照 lst 中的所有值进行检查。如果它是一个子字符串,则初始化一个新键并设置 dct 中的值。

newdct = {}
for i in dct.keys():
    for j in lst:
        if j.find(i)!=-1:
            newdct[j] = dct[i]

输出

{'A_blue': 0.5, 'B_blue': 0.5, 'C_blue': 0.5, 'A_yellow': 0.1, 'B_yellow': 0.1, 'C_yellow': 0.1, 'A_green': 0.3, 'B_green': 0.3, 'C_green': 0.3, 'A_red': 0.8, 'B_red': 0.8, 'C_red': 0.8}

试试这个:

lst = [
    'A_blue',
    'A_yellow',
    'A_green',
    'A_red',
    'B_blue',
    'B_yellow',
    'B_green',
    'B_red',
    'C_blue',
    'C_yellow',
    'C_green',
    'C_red'
]
dct = {'blue': 0.5, 'yellow': 0.1, 'green': 0.3, 'red': 0.8}

{l : dct[k] for k in dct.keys() for l in lst if k in l}

输出:

{'A_blue': 0.5,
 'B_blue': 0.5,
 'C_blue': 0.5,
 'A_yellow': 0.1,
 'B_yellow': 0.1,
 'C_yellow': 0.1,
 'A_green': 0.3,
 'B_green': 0.3,
 'C_green': 0.3,
 'A_red': 0.8,
 'B_red': 0.8,
 'C_red': 0.8}

你可以试试听写理解

{i: dct[k] for i in lst for k in dct if k in i}
{'A_blue': 0.5,
 'A_yellow': 0.1,
 'A_green': 0.3,
 'A_red': 0.8,
 'B_blue': 0.5,
 'B_yellow': 0.1,
 'B_green': 0.3,
 'B_red': 0.8,
 'C_blue': 0.5,
 'C_yellow': 0.1,
 'C_green': 0.3,
 'C_red': 0.8}

注意:由于 if k in i 有效地迭代 for k in dct,正常循环可能会更快,因此最好像这样使用 break

d = {}
for i in lst:
    for k in dct:
        if k in i:
            d[i] = dct[k]
            break
            
print(d)

试试下面的方法

lst = [
    'A_blue',
    'A_yellow',
    'A_green',
    'A_red',
    'B_blue',
    'B_yellow',
    'B_green',
    'B_red',
    'C_blue',
    'C_yellow',
    'C_green',
    'C_red'
]

dct = {'blue': 0.5, 'yellow': 0.1, 'green': 0.3, 'red': 0.8}

result = {x: dct[x[2:]] for x in lst}
print(result)

输出

{'A_blue': 0.5, 'A_yellow': 0.1, 'A_green': 0.3, 'A_red': 0.8, 'B_blue': 0.5, 'B_yellow': 0.1, 'B_green': 0.3, 'B_red': 0.8, 'C_blue': 0.5, 'C_yellow': 0.1, 'C_green': 0.3, 'C_red': 0.8}