【问题标题】:Nested list to dict嵌套列表到字典
【发布时间】:2017-08-30 19:50:33
【问题描述】:

我正在尝试通过嵌套的list 创建dict

groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]

L = [{y:x[0] for y in x if y != x[0]} for x in groups]
d = { k: v for d in L for k, v in d.items()}

print (d)
{'B': 'Group1', 'C': 'Group2', 'D': 'Group2', 'A': 'Group1'}

不过好像有点复杂。

有没有更好的解决方案?

【问题讨论】:

标签: python list dictionary list-comprehension


【解决方案1】:

怎么样:

d = {k:row[0] for row in groups for k in row[1:]}

这给出了:

>>> {k:row[0] for row in groups for k in row[1:]}
{'D': 'Group2', 'B': 'Group1', 'C': 'Group2', 'A': 'Group1'}

因此,您遍历groups 中的每个row。该行的第一个元素被视为值 (row[0]),然后您遍历 row[1:] 以获取所有键 k

看起来很奇怪,当你给它一个空行(如groups = [[],['A','B']])时,这个表达式也有效。这是因为row[1:] 将为空,因此row[0] 部分从不评估:

>>> groups = [[],['A','B']]
>>> {k:row[0] for row in groups for k in row[1:]}
{'B': 'A'}

【讨论】:

  • 关于列表理解的超级帖子。
【解决方案2】:

我认为单行解决方案有点混乱。我会写如下代码

groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]

result = {}
for group in groups:
    for item in group[1:]:
        result[item] = group[0]
print result

【讨论】:

  • 好多了。大多数时候,1线解决方案只是为了展示聪明才智
【解决方案3】:

这本质上是威廉的一个更漂亮的版本:

>>> groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]
>>> {k:g for g,*tail in groups for k in tail}
{'B': 'Group1', 'A': 'Group1', 'C': 'Group2', 'D': 'Group2'}

但它不适用于空列表:groups = [[],['A','B']]

>>> {k:head for head, *tail in grps for k in tail}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <dictcomp>
ValueError: not enough values to unpack (expected at least 1, got 0)

【讨论】:

    【解决方案4】:

    我也喜欢威廉的解决方案,但只是为了完整性......

    使用 itertools 和生成器函数的另一个变体(仅限 Python 3.x)

    def pairs(groups):
        for value,*keys in groups:
            for key_value in zip(keys, itertools.repeat(value)): 
                yield key_value
    
    dict(pairs(groups))
    {'A': 'Group1', 'B': 'Group1', 'C': 'Group2', 'D': 'Group2'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 2020-06-01
      相关资源
      最近更新 更多