我无法在python中检索到dict的正确输出

2024-10-01 22:41:52 发布

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

请查看此代码。对于dic[0],它必须打印为“med”,而不是“No”。请问如何解决这个问题

dico = {}

listo = ['med', 'lam', 'rih', 'holy', 'lem']
mm = ['med', 'holy']
for i, v in enumerate(listo):
    for x in mm:
        if x in v:
            dico[i] = x
        else:
            dico[i] = 'No'
            
dico

这是输出:

{0: 'No', 1: 'No', 2: 'No', 3: 'holy', 4: 'No'}


Tags: no代码inforifmeddicomm
2条回答

问题是,如果存在匹配项,则将dict中的值设置为x,然后继续循环并将下一个值设置回"No"。如前所述,您可以使用break在第一次匹配时退出循环。或者您可以使用next获取下一个匹配值(如果有),或者使用"No"获取其他匹配值

dico = {}
for i, v in enumerate(listo):
    dico[i] = next((x for x in mm if x in v), "No")

这样,你甚至可以把它变成一本字典

dico = {i: next((x for x in mm if x in v), "No") for i, v in enumerate(listo)}

然而,使用"No"作为默认值可能不是一个好的选择,因为从技术上讲它也可能在mm中。相反,您可能更愿意使用None。 但从评论来看,您可能实际上想要一个所有匹配项的列表,这将更加简单:

dico = {i: [x for x in mm if x in v] for i, v in enumerate(listo)}
# {0: ['med'], 1: [], 2: [], 3: ['holy'], 4: []}

当然,如果键只是索引,也可以使用更简单的列表理解:

dico = [[x for x in mm if x in v] for v in listo]
# [['med'], [], [], ['holy'], []]

(另外,当值实际为==时,您正在测试in,但这可能只是在本例中。)

如果找到匹配项,则需要从循环中break,并且仅当未找到匹配项时才将其设置为No。像这样:

dico = {}

listo = ['med', 'lam', 'rih', 'holy', 'lem']
mm = ['med', 'holy']
for i, v in enumerate(listo):
    for x in mm:
        if x in v:
            dico[i] = x
            break
    else:
        dico[i] = 'No'

print(dico)

输出:

{0: 'med', 1: 'No', 2: 'No', 3: 'holy', 4: 'No'}

您遇到的问题是,由于没有从内部for循环中断,因此在您已经编写了'med'之后,在以后的迭代中用'No'覆盖dico[0]

(注意此处else的缩进-它伴随for而不是if。)

相关问题 更多 >

    热门问题