在字典理解中临时分配变量的优雅方式?

时间:2014-07-29 13:36:11

标签: python dictionary dictionary-comprehension

出于好奇,有可能将以下逻辑写成一个不错的词典理解吗?

a = "a c\nb c\nn q\n".split('\n')[:-1]

output = {}
for line in a:
    tmp = line.split(' ')
    output[tmp[0]] = tmp[1]

我写了以下内容,但没有临时任务,我必须拆分两次,这是不幸的:

{line.split(' ')[0]:line.split(' ')[1] for line in a}

可能更优雅吗?

7 个答案:

答案 0 :(得分:6)

在这种情况下,我认为dict 构造函数更好一点,因为它需要一个可迭代的2个序列:

dict(line.split() for line in a)

演示:

>>> a
['a c', 'b c', 'n q']
>>> dict(line.split() for line in a)
{'a': 'c', 'b': 'c', 'n': 'q'}

答案 1 :(得分:4)

使用嵌套列表推导:

{p[0]:p[1] for p in [l.split(" ") for l in a]}

输出:

{'a': 'c', 'b': 'c', 'n': 'q'}

答案 2 :(得分:2)

高度针对特定输入中的空格:

>>> a = "a c\nb c\nn q\n".split('\n')[:-1]
>>> {line[0]:line[2] for line in a}
{'a': 'c', 'b': 'c', 'n': 'q'}

答案 3 :(得分:0)

是否有效:

>>> a = "a c\nb c\nn q\n".split('\n')[:-1]

>>> {i[0]:i[1]  for line in a for i in [line.split(' ')]}
 {'a': 'c', 'b': 'c', 'n': 'q'}

答案 4 :(得分:0)

在这种情况下,您可以使用

dict(line.split(' ') for line in a)

但是对于更复杂的“值处理”,我通常会发现使用“正常”循环(就像你做的那样)或编写小辅助函数更容易:

def helper(val):
    ...
    return key, value

dict(helper(line) for line in a)

这是一件事(残缺的lambda /匿名函数语法)我真的讨厌python。

答案 5 :(得分:0)

使用嵌套列表推导而不进行拆分。

>>> {line[0]:line[-1] for line in a}
{'a': 'c', 'b': 'c', 'n': 'q'}

答案 6 :(得分:0)

通过python的re模块,

>>> import re
>>> a = "a c\nb c\nn q\n"
>>> a
'a c\nb c\nn q\n'
>>> m = re.findall(r'^(.) (.)$', a, re.M)
>>> m
[('a', 'c'), ('b', 'c'), ('n', 'q')]
>>> dict(m)
{'a': 'c', 'b': 'c', 'n': 'q'}
相关问题