【问题标题】:How to get multiple dictionary values?如何获取多个字典值?
【发布时间】:2014-08-03 22:34:12
【问题描述】:

对不起,如果这个问题已经存在,但我已经搜索了很长一段时间了。

我在 python 中有一个字典,我想做的就是从中获取一些值作为一个列表,但我不知道这是否被实现支持。

myDictionary.get('firstKey')   # works fine

myDictionary.get('firstKey','secondKey')
# gives me a KeyError -> OK, get is not defined for multiple keys
myDictionary['firstKey','secondKey']   # doesn't work either

但是我有什么办法可以做到这一点吗?在我的示例中,它看起来很简单,但是假设我有一个包含 20 个条目的字典,并且我想获得 5 个键。除了做还有什么办法吗

myDictionary.get('firstKey')
myDictionary.get('secondKey')
myDictionary.get('thirdKey')
myDictionary.get('fourthKey')
myDictionary.get('fifthKey')

【问题讨论】:

标签: python dictionary


【解决方案1】:

使用for 循环:

keys = ['firstKey', 'secondKey', 'thirdKey']
for key in keys:
    myDictionary.get(key)

或列表推导:

[myDictionary.get(key) for key in keys]

【讨论】:

  • 好的我已经考虑过了,但是真的没有实现的方法吗?我的意思是,我猜这并不是完全奇怪的事情
  • 如果保证keys中的每一个key都在字典中,可以写[myDictionary[key] for key in keys],但没有比这更简单的了。
  • [my_dict.get(x) for x in ['firstKey', 'secondKey', 'thirdKey']]单线解决方案,但您将获得尽可能紧凑的解决方案。
  • 好吧,这很不幸。但非常感谢您的努力!
  • 根据用例,您可能需要一个if 语句来检查get 方法返回的None 值:[mydict.get(key) for key in keys if key in mydict]
【解决方案2】:

已经存在一个函数:

from operator import itemgetter

my_dict = {x: x**2 for x in range(10)}

itemgetter(1, 3, 2, 5)(my_dict)
#>>> (1, 9, 4, 25)

itemgetter 如果传递了多个参数,将返回一个元组。要将列表传递给itemgetter,请使用

itemgetter(*wanted_keys)(my_dict)

请记住,itemgetter 在仅请求一个键时不会将其输出包装在元组中,并且不支持请求零键。

【讨论】:

  • 你能缩短多少?如果名称太长...g = itemgetter。 o.O
  • 是否有返回键字典的选项:指定键列表的值对而不仅仅是值?
  • @alancalvitti 你总是可以做到的{key: mydictionary.get(key) for key in keys}
  • 小问题,itemgetter 至少需要一个参数,所以如果你想做类似itemgetter(*some_keys)(some_dict) 的事情,如果some_keys 是一个空列表,它将失败。
  • itemgetter 不会处理 KeyError
【解决方案3】:

你可以使用Atfrom pydash:

from pydash import at
my_dict = {'a': 1, 'b': 2, 'c': 3}
my_list = at(my_dict, 'a', 'b')
my_list == [1, 2]

【讨论】:

  • 我建议在示例中为 dict var 选择一个更好的名称。否则它会隐藏内置的 dict 类型。
  • @IvanDePazCenteno 确实如此——刚刚解决了您的评论。感谢您指出!
【解决方案4】:

如果后备键不是太多,你可以这样做

value = my_dict.get('first_key') or my_dict.get('second_key')

【讨论】:

    【解决方案5】:

    我建议使用非常有用的 map 函数,它允许函数在列表上按元素操作:

    mydictionary = {'a': 'apple', 'b': 'bear', 'c': 'castle'}
    keys = ['b', 'c']
    
    values = list( map(mydictionary.get, keys) )
    
    # values = ['bear', 'castle']
    

    【讨论】:

    • 一个修正要让它工作,你必须用一个列表包围mapvalues = list( map(mydictionary.get, keys) )
    • 确实处理 KeyError
    • 与列表理解相比,我对这个解决方案进行了计时(否则这将是我的偏好),并且这个没有包含在列表中的解决方案要快 3.5 倍,所以(+1)对于我们的情况可以直接使用迭代器。 (包含在一个列表中会花费同样长的时间,在这种情况下,我只会做看起来更容易阅读的列表理解)。
    【解决方案6】:

    如果你安装了pandas,你可以把它变成一个以键为索引的系列。所以像

    import pandas as pd
    
    s = pd.Series(my_dict)
    
    s[['key1', 'key3', 'key2']]
    

    【讨论】:

      【解决方案7】:

      我在这里没有看到类似的答案 - 值得指出的是,使用(列表/生成器)推导式,您可以在一行代码中解压缩这些多个值并将它们分配给多个变量:

      first_val, second_val = (myDict.get(key) for key in [first_key, second_key])
      

      【讨论】:

        【解决方案8】:

        我认为列表理解是不需要任何额外导入的最简洁的方法之一:

        >>> d={"foo": 1, "bar": 2, "baz": 3}
        >>> a = [d.get(k) for k in ["foo", "bar", "baz"]]
        >>> a
        [1, 2, 3]
        

        或者,如果您希望将值作为单个变量,则使用多重赋值:

        >>> a,b,c = [d.get(k) for k in ["foo", "bar", "baz"]]
        >>> a,b,c
        (1, 2, 3)
        

        【讨论】:

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