如何从可能具有空值的列表列表中生成字典?

时间:2018-12-15 20:09:34

标签: python

我有一个列表列表:dep = [['ArithmeticError'], ['ZeroDivisionError', 'ArithmeticError'], ['OSError'], ['FileNotFoundError', 'OSError']],我需要将其转换为像dep = {'ArithmeticError': None, 'ZeroDivisionError': 'ArithmeticError', 'OSError': None, 'FileNotFoundError': 'OSError'}这样的字典。也可以将字符串列表作为值包含一些错误名称。 我看到了dict()的变体,但对我来说不起作用,因为可能有空值。 我尝试使用dep = dict(dep),但出现错误:“词典更新序列元素#0的长度为1; 2为必需”。

5 个答案:

答案 0 :(得分:3)

您可以在每个子列表的末尾添加None,然后采用前两项。

dep = dict((sublist + [None])[:2] for sublist in dep)

例如使用pprint打印效果好

>>> dep = [['ArithmeticError'],
...        ['ZeroDivisionError', 'ArithmeticError'],
...        ['OSError'],
...        ['FileNotFoundError', 'OSError']]

>>> from pprint import pprint

>>> result = dict((sublist + [None])[:2] for sublist in dep)

>>> pprint(result)
{'ArithmeticError': None,
 'FileNotFoundError': 'OSError',
 'OSError': None,
 'ZeroDivisionError': 'ArithmeticError'}

编辑:为更清楚起见,我们还可以使用itemgetter为返回的名称命名:

>>> from operator import itemgetter
>>> first_two = itemgetter(0, 1)

>>> first_two(['ZeroDivisionError', 'ArithmeticError', None])
('ZeroDivisionError', 'ArithmeticError')

然后上述解决方案变为:

>>> result = dict(first_two(sublist + [None]) for sublist in dep)

答案 1 :(得分:1)

您可以这样做:

dep = [['ArithmeticError'], ['ZeroDivisionError', 'ArithmeticError'],
   ['OSError'], ['FileNotFoundError', 'OSError']]

dep_dict = {}

for val in dep:
    if len(val) == 1:
        dep_dict[val[0]] = None
    else:
        dep_dict[val[0]] = val[1]

通过制作字典dep_dict并将其键指定为dep的值并将其值分配给None或对应列表中的第二项来起作用。

答案 2 :(得分:1)

只需一张小支票和一个发电机

dep = dict((a[0],a[1]) if len(a)>1 else (a[0],None) for a in dep)

答案 3 :(得分:1)

您可以使用具有基本条件的生成器。

dep_dict = {i[0]: None if len(i) == 1 else i[1]   for i in dep}

答案 4 :(得分:0)

也许有更简单的方法,但是您可以使用:

dep = [['ArithmeticError'], ['ZeroDivisionError', 'ArithmeticError'], ['OSError'], ['FileNotFoundError', 'OSError']]

d={}
for x in dep:
    if len(x) == 1:
        d[x[0]] = None
    elif len(x) == 2:
        d[x[0]] = x[1]

print(d)

输出:

{'ArithmeticError': None, 'ZeroDivisionError': 'ArithmeticError', 'OSError': None, 'FileNotFoundError': 'OSError'}