【问题标题】:Concatenating dict values, which are lists连接 dict 值,它们是列表
【发布时间】:2017-05-18 06:44:40
【问题描述】:

假设我有以下 dict 对象:

test = {}
test['tree'] = ['maple', 'evergreen']
test['flower'] = ['sunflower']
test['pets'] = ['dog', 'cat']

现在,如果我运行test['tree'] + test['flower'] + test['pets'],我会得到结果:

['maple', 'evergreen', 'sunflower', 'dog', 'cat']

这就是我想要的。

但是,假设我不确定 dict 对象中有哪些键,但我知道所有值都是列表。有没有像sum(test.values()) 这样的方法或者我可以运行以达到相同结果的方法?

【问题讨论】:

    标签: python list python-3.x dictionary


    【解决方案1】:

    几乎在问题中给出了答案: sum(test.values()) 只会失败,因为默认情况下它假定您希望将项目添加到 0 的起始值,当然您不能将 list 添加到 int。但是,如果您明确指定起始值,它将起作用:

     sum(test.values(), [])
    

    【讨论】:

    • 感谢您的解释!很高兴知道我在正确的轨道上。这一行是最短且最易读的。在某些需要更多可读性的设置中,我也可能会使用 Psidom 的答案。
    【解决方案2】:

    使用来自itertoolschain

    >>> from itertools import chain
    >>> list(chain.from_iterable(test.values()))
    # ['sunflower', 'maple', 'evergreen', 'dog', 'cat']
    

    【讨论】:

    • 不确定为什么不赞成,但这也是我的解决方案。另一种方法是list(chain(*test.values()))
    【解决方案3】:

    一个班轮(假设不需要特定的顺序):

    >>> [value for values in test.values() for value in values]
    ['sunflower', 'maple', 'evergreen', 'dog', 'cat']
    

    【讨论】:

    • 我已经使用 python 工作了一段时间,有时我会惊讶于列表推导是多么不可读。
    • @ospahiu 你能解释一下你的代码是如何工作的吗?例如,[x for x in val for val in a.values()] 不起作用,但为什么呢?这里a={'a':[1,2,3],'b'=[4,5,6],'c'=[7,8,9]}
    【解决方案4】:

    您可以像这样使用functools.reduceoperator.concat(我假设您使用的是Python 3):

    >>> from functools import reduce
    >>> from operator import concat
    >>> reduce(concat, test.values())
    ['maple', 'evergreen', 'sunflower', 'dog', 'cat']
    

    【讨论】:

      【解决方案5】:

      另一个使用 numpy.hstack 的简单选项:

      import numpy as np
      
      >>> np.hstack(list(test.values()))
      array(['maple', 'evergreen', 'sunflower', 'dog', 'cat'], dtype='<U9')
      

      【讨论】:

      • 更简单:np.hstack(test.values())
      • 没错,相应修改!不过,在未来,numpy 堆栈必须作为序列传递。因此list().
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      相关资源
      最近更新 更多