【问题标题】:Get the key which has multiple value by its values in a dictionary通过字典中的值获取具有多个值的键
【发布时间】:2020-04-08 07:05:17
【问题描述】:

我有一个字典,它的键有多个值,我有一个列表,其中一些项是字典中的值,而另一些则不是。我要做的是读取该列表中的每个项目,如果它是字典中的一个值,则将它的密钥对附加到另一个列表中,如果它没有附加项目本身,但我什么也没得到

d = {'salam':('hi', 'ciao', 'bonjour'), 'mamnoon':('thanks', 'grazie', 'merci')}
l = ['hi', 'thanks', 'very', 'much']
l1 = []
for i in range(0, len(l)):
    search_val = l[i]
    for key, val in d.items():
        if val == search_val:
            l1.append(key)
        else:
            l1.append(l[i])
print(l1)

我正在寻找的输出是这个,但我一直收到一个空列表

['salam', 'mamnoon', 'very', 'much']

【问题讨论】:

  • 你想要if search_val in val,因为val 是多个字符串的元组。这将检查 search_val 是否在您字典中每一对的元组中。

标签: python dictionary python-3.6 key-value


【解决方案1】:

您正在寻找if search_val in val 而不是if val == search_val,因为val 是多个字符串的元组,您不想测试您的search_val 是否等于完整元组,只是元组包含您的search_val

由于您的预期输出包括那些在您的字典值中找不到的字符串,您可以编写如下内容:

d = {'salam':('hi', 'ciao', 'bonjour'), 'mamnoon':('thanks', 'grazie', 'merci')}
l = ['hi', 'thanks', 'very', 'much']
l1 = []
for search_val in l:
    for key, val in d.items():
        if search_val in val:
            l1.append(key)
            break
    else:
        l1.append(search_val)
print(l1)

输出:

['salam', 'mamnoon', 'very', 'much']

在这里,一旦找到带有search_val 的键,我们就停止搜索字典(因为我们假设只有一个键在其元组中具有该值)。 for 循环的else 子句如果循环正常完成(即因为遇到break 语句而没有退出),则将执行,这对应于search_val 未找到。在这种情况下,我们将appendsearch_val 改为l1

不使用for/else 语法的替代方法可以使用found 标志:

d = {'salam':('hi', 'ciao', 'bonjour'), 'mamnoon':('thanks', 'grazie', 'merci')}
l = ['hi', 'thanks', 'very', 'much']
l1 = []
for search_val in l:
    found = False
    for key, val in d.items():
        if search_val in val:
            l1.append(key)
            found = True
    if not found:
        l1.append(search_val)
print(l1)

【讨论】:

  • 这是这段代码给我的输出:['salam', 'thanks', 'mamnoon', 'very', 'very', 'much', 'much']
  • 如果您将else 子句缩进到与if 相同的级别,您将得到输出。这里的else 子句应该缩进到与你的内部for 循环相同的级别。见stackoverflow.com/questions/9979970/…
  • 我添加了一个替代方案,它不使用此语法,而是使用 found 布尔标志。这可能更清楚,因为for/else 语法并不常用,但在这种情况下可以很好地工作。
【解决方案2】:

您的解决方案几乎是正确的,但您需要在内部 for 循环中编辑条件

val : 是一个元组,比较一个元组和字符串的结果是假的,所以它什么也不附加,你会得到一个空列表。

而不是if val == search_val: 尝试if search_val in val:

这将导致l1 = ['salam', 'mamnoon']

【讨论】:

  • 感谢这将适用于字典中的值的项目,但我应该为那些不是的项目做些什么。我忘记了我现在编辑的代码的一部分,但输出仍然不是我想要的
  • @Palreza 请检查我对您问题第二部分的回答。
  • else条件与for循环同级
【解决方案3】:

itertools.chain() 方法与一些列表理解的组合如何在一行中执行此操作:

import itertools 
d = {'salam':('hi', 'ciao', 'bonjour'), 'mamnoon':('thanks', 'grazie', 'merci')}
l = ['hi', 'thanks', 'very', 'much']
l1 = [i if not i in itertools.chain(*d.values()) else [key for key in d if i in d[key]][0] for i in l]
print(l1)

返回:

['salam', 'mamnoon', 'very', 'much']

【讨论】:

    猜你喜欢
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    相关资源
    最近更新 更多