嵌套列表到dict

时间:2017-04-05 09:26:26

标签: python list dictionary list-comprehension

我尝试通过嵌套dict创建list

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'}

但似乎有点复杂。

有更好的解决方案吗?

4 个答案:

答案 0 :(得分:21)

怎么样:

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'}

因此,您在row中迭代groups 。该行的第一个元素被视为值(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'}

答案 1 :(得分:8)

这实际上是Willem的一个更漂亮的版本:

Count

但它不适用于空列表:<CheckBox x:Name="ChkBox" Margin="13 0 0 10" Content="{Binding}" > <CheckBox.IsChecked> <MultiBinding Converter="{StaticResource CheckBoxConverter}" Mode="TwoWay" > <Binding ElementName="ChkBox" Path="Content" /> <Binding RelativeSource="{RelativeSource AncestorType={x:Type UserControl}}" Path="SelectedItems"/> <Binding RelativeSource="{RelativeSource AncestorType={x:Type UserControl}}" Path="SelectedItems.Count"/> </MultiBinding> </CheckBox.IsChecked> </CheckBox>

>>> 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'}

答案 2 :(得分:6)

我认为一线解决方案有点混乱。我会写下面的代码

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

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

答案 3 :(得分:4)

我也喜欢Willem的解决方案,但仅仅是为了完整......

使用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'}