【问题标题】:python dictionary put values of keys into a list where the keys are in another listpython字典将键的值放入一个列表中,其中键在另一个列表中
【发布时间】:2017-11-09 15:28:58
【问题描述】:

我有一本看起来像的字典

a = {32: [2230], 37265: [2218], 51: [2223], 164: [2227], 3944: [2224]}

但是,a 中的值可能包含多个元素,例如

a = {32: [2200, 2230], 37265: [2201, 2218], 51: [2223], 164: [2227], 3944: [2224]}

我有一个列表,将 a 中的密钥分组存储,

b = [[32, 51, 164], [3944, 37265]]

现在我想在另一个列表中获取每个组中键的值,

        clusters = []
        for key_group in b:
            group = []

            for key in key_group:
                group.extend(a[key])

            if len(group) > 1:
                clusters.append(group) 

所以最终列表看起来像,

clusters = [[2230, 2223, 2227], [2224, 2218]]

如果a 在一个值列表中包含多个元素,clusters 看起来像,

clusters = [[2200, 2230, 2223, 2227], [2224, 2201, 2218]]

我想知道最好的方法是什么。

如果b 包含只有一个值/键的列表,并且如果此键映射到a 中的单个元素列表,则此列表将被忽略,

a = {32: [2200, 2230], 37265: [2201, 2218], 51: [2223], 164: [2227], 3944: [2224]}

b = [[32, 51, 164], [3944], [37265]]

虽然3944 映射到[2224],这将被忽略,但37265 映射到[2201, 2218],它将被保留,因为len([2201, 2218]) > 1。在这种情况下,clusters 将如下所示,

clusters = [[2200, 2230, 2223, 2227], [2201, 2218]]         

【问题讨论】:

  • 你能解释一下“最好”是什么意思吗?
  • @PeterWood 简洁、简单、高效的方式?
  • 我编辑了答案让我知道这是否适合你:)
  • @DamianLattenero 前 3 个答案全部有效 :)
  • @daiyue 太棒了!我必须练习才能给出更好的答案哈哈...

标签: python python-3.x dictionary


【解决方案1】:

假设您在a 中的值始终只是一个包含单个元素的列表,那么它就是一个简单的嵌套list comprehension

[[a[k][0] for k in sublist] for sublist in b]
# [[2230, 2223, 2227], [2224, 2218]]

既然您现在已经阐明了 a 的值可以是包含多个元素的列表,您可以使用 itertools.chain.from_iterable 来展平返回的列表并给出您想要的输出:

from itertools import chain
[list(chain.from_iterable(a[k] for k in sublist)) for sublist in b]
# [[2200, 2230, 2223, 2227], [2224, 2201, 2218]]

【讨论】:

  • 感谢您的回复,但a 中的值可能包含多个元素。
  • @daiyue 你能用多个元素为你的a 显示所需的输出吗
  • @Chris_Rands 看看我的操作
  • @Chris_Rands 但答案也应该考虑到if len(group) > 1:,就像我的操作代码中一样
  • @daiyue 对不起,我不明白,您需要添加另一个示例来说明您想要的行为
【解决方案2】:

你可以使用 list comp 来做同样的工作:

clusters = [[a[key][0] for key in k] for k in b]

res => [[2230, 2223, 2227], [2224, 2218]]

如果一个可以有多个元素,你也可以这样做:

clusters = [[it for key in k for it in a[key]] for k in b]

res => [[2200, 2230, 2223, 2227], [2224, 2201, 2218]]

【讨论】:

    【解决方案3】:

    我建议使用三元组列表理解:

    list(filter(lambda l:len(l) > 1, ([elem for key in lst for elem in a[key]] for lst in b)))
    

    这适用于任意长度的列表值。 filter 删除包含一个或零个元素的列表。

    【讨论】:

      【解决方案4】:

      根据您的编辑:

      [[item for i in sub for item in a[i]] for sub in b]
      

      【讨论】:

        猜你喜欢
        • 2021-07-12
        • 2021-05-31
        • 2022-06-23
        • 2022-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多