【问题标题】:Pythonic way to find and replace with a dictionary of lists [duplicate]用列表字典查找和替换的Pythonic方法[重复]
【发布时间】:2016-07-12 19:24:05
【问题描述】:

我有这本词典:

dic = {
'foo': ['one', 'two', 'three'],
'bar': ['four', 'five', 'six'],
'baz': ['seven', 'eight', 'nine']
}

从这个列表中:

my_list = ['one', 'five', 'nine']

我想在字典中搜索相应的键以获得这个新列表:

['foo', 'bar', 'baz']

我的实际工作代码是:

l = []
for el in my_list:
    for d_key, d_val in dic.items():
        if el in d_val:
            l.append(d_key)

print(l)

但我认为还有一种更 Pythonic 的方式。有什么想法吗?


编辑:

感谢 TigerhawkT3 的建议(可读性很重要,但实用性胜过纯度),我选择反转字典以直接获取值。现在我的代码看起来像:

dic = {'one': 'foo', 'two': 'foo', 'three': 'foo', 'four': 'bar', 'five': 'bar', 'six': 'bar', 'seven': 'baz', 'nine': 'baz', 'eight': 'baz'}
my_list = ['one', 'five', 'nine']
print([dic[x] for x in my_list])

【问题讨论】:

  • 您正在查找值以获取密钥。这与字典的预期用途相反。
  • @TigerhawkT3 我不确定这是否是有效的重复,因为 dict 值和“my_list”都是列表。
  • 鉴于您刚刚接受的答案将原来的字典完全颠倒过来,我不明白您的抱怨...
  • 代码更短,数据更易懂。
  • 我还是不明白。您是否只是想要一种更简洁的方式来表达您实际想要使用的字典?可读性很重要,但实用性胜过纯度。如果你的数据结构很漂亮但落后,那有什么意义呢?

标签: python dictionary


【解决方案1】:

我先把字典倒过来:

invdic = {val: key for key in dic for val in dic[key]}

然后你可以应用替换:

l = ['one', 'five', 'nine']
l = list(invdic[x] for x in l)
print(l)

编辑:如果需要保留关键字,当字典中不包含匹配项时,可以将第二行替换为:

l = list(invdic.get(x, x) for x in l)

【讨论】:

    【解决方案2】:

    您可以使用isdisjoint() 来检查一个键值是否与您的元组有共同的元素。

    >>> s = set(my_list)
    >>> [key for key, value in dic.items() if not s.isdisjoint(value)]
    ['foo', 'baz', 'bar']
    

    如果键的顺序很重要,那么:

    >>> [key for item in my_list for key, value in dic.items() if item in value]
    ['foo', 'bar', 'baz']
    

    【讨论】:

      猜你喜欢
      • 2022-06-23
      • 2020-10-05
      • 2019-05-03
      • 2020-10-13
      • 2017-12-23
      • 2020-02-20
      • 2012-04-16
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多