【问题标题】:How to get single value from dict with single entry?如何通过单个条目从 dict 中获取单个值?
【发布时间】:2017-09-23 13:34:45
【问题描述】:

我看到How to extract dictionary single key-value pair in variables建议:

d = {"a":1}
(k, v), = d.items()

但是:我只关心价值。我想将该值传递给一个方法;喜欢:

foo(v)

所以问题是:是否有一个适用于 python2 和 python3 的简单命令直接为我提供该值,而无需绕行“元组”赋值?

或者有没有办法让元组分配适用于我调用方法的用例?

【问题讨论】:

  • v, = d.values() 在 Py2 和 3 中都可以正常工作,你显然需要在调用函数之前解包。
  • 起初我以为这很简单。我的意思是只使用密钥获取值,但后来我得到了它。你不知道钥匙。我发现这可能会有所帮助:stackoverflow.com/questions/3097866/…

标签: python python-3.x dictionary


【解决方案1】:

list(d.values())[0] 将被评估为 1。 正如 cmets 中所指出的,只有在 python3 中才需要转换为 list

next(iter(d.values())) 是另一种可能性(可能更节省内存,因为您不需要创建列表)

两个解决方案都使用 python 3.6.0 和TIO with python 2 在本地进行测试。

【讨论】:

  • 为什么又用list() 转换列表?
  • @WiriyaRungruang d.values() 不是 list :它是一个 dict_values 对象,不支持索引。但是因为它是可迭代的,所以可以转换成list,支持索引。
  • @B.Barbieri d.values()[0]list(d.values())[0] 我得到了相同的结果和 type(d.values()) 它的显示 <type 'list'>
  • @WiriyaRungruang 你是对的......在python 2上。在python 3.6.0上,它显示<class 'dict_values'>
【解决方案2】:

next(iter(d.values())) 是从字典中提取唯一值的自然方式。不需要转换为list 来提取唯一的元素。

它也是可用选项中表现最好的(在 Python 3.6 上测试):

d = [{'a': i} for i in range(100000)]

%timeit [next(iter(i.values())) for i in d]  # 50.1 ms per loop
%timeit [list(i.values())[0] for i in d]     # 54.8 ms per loop
%timeit [list(i.values()).pop() for i in d]  # 81.8 ms per loop

【讨论】:

    【解决方案3】:

    如果你知道关键,那么你可以简单地做:

    d["a"] 
    output :
    1
    

    如果你不知道钥匙:

    for key in d.keys():
    d[key]
    
    #so basically you have to do :
    
    for key in d.keys():
    f00(d[key])
    

    【讨论】:

      【解决方案4】:

      是否有一个适用于 python2 和 python3 的简单命令 直接给我那个值,没有“元组”的绕道 任务?

      使用dict.copy()(保留原始字典)和dict.popitem()函数的解决方案:

      d = {"a":1}
      foo(d.copy().popitem()[1])
      

      【讨论】:

      • 为了避免更改原件而需要制作副本严重限制了这种方法的实用性,IMO。
      【解决方案5】:

      使用more_itertools.one 很短,并且还验证是否存在单个条目

      In [1]: from more_itertools import one
         ...: d = {"a":5}
         ...: one(d.values())
      Out[1]: 5
      
      

      【讨论】:

        【解决方案6】:

        有没有办法让元组分配适用于我的用例

        v, *_ = d.values()
        

        扩展解包将在 Python 3 中完成这项工作,如果 d 为空,则以 ValueError: Not enough values to unpack 失败。 Python 2 中不提供扩展解包功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 2019-06-13
          • 1970-01-01
          • 2018-09-18
          • 2020-02-02
          • 2017-09-28
          相关资源
          最近更新 更多