【问题标题】:Getting values from a dict according to a list of keys根据键列表从字典中获取值
【发布时间】:2020-12-06 16:09:55
【问题描述】:

我有一个清单。

mapper = {"a": 9, "b": 7}
A = ["a", "b"]

我想得到:

result = [9, 7]

我知道有多种方法可以实现,例如:

result = [mapper[char] for char in A]
result = list(map(lambda x: mapper[x], A))

对于第二种方式,我们可以使用operator模块而不是使用lambda吗?

我找到了一个叫operator.getitem()的方法,我尝试使用

result = list(map(operator.getitem(mapper), A))

但这会引发异常。

我知道list(map(lambda x: operator.getitem(mapper, x), A)) 会起作用,但我只是想避免使用lambda

我找到了this question,但没有找到解决办法。

【问题讨论】:

  • itertools.starmap(operator.getitem, zip(itertools.repeat(mapper), A)) 之类的东西应该可以。但是列表理解显然要容易得多。

标签: python python-3.x


【解决方案1】:

看起来您正在寻找operator.itemgetter(注意第二个表单,它返回多个项目):

>>> operator.itemgetter(*A)(mapper)
(9, 7)

【讨论】:

    【解决方案2】:

    为了完整性:

    我找到了一个叫operator.getitem()的方法,我尝试使用result = list(map(operator.getitem(mapper), A))

    这里出了什么问题,你想每次将mapperA 的元素之一作为两个单独的参数传递 - 所以你实际上不能提前调用函数,而是需要“绑定" 调用的 mapper 参数。

    为此,我们使用functools.partial

    import functools, operator
    
    list(map(functools.partial(operator.getitem, mapper), A))
    

    尴尬,但可行。这就是为什么列表推导更加 Pythonic。

    (operator.itemgetter 确实可以一次完成所有事情,如图所示;但是当要访问的元素是固定的并且 容器 变化时,它更常用 - 特别是对嵌套的某个键的容器。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 2013-08-29
      • 1970-01-01
      相关资源
      最近更新 更多