在字典推导中优雅地临时赋值变量的方法?
出于好奇,能不能把下面的逻辑用一个漂亮的字典推导式写出来呢?
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
使用嵌套的列表推导式,而不使用分割。
>>> {line[0]:line[-1] for line in a}
{'a': 'c', 'b': 'c', 'n': 'q'}
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'}
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'}
7
在这种情况下,我觉得使用字典的构造函数会更好,因为它可以接受一个包含两个元素的可迭代对象:
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'}
5
使用嵌套的列表推导式:
{p[0]:p[1] for p in [l.split(" ") for l in a]}
输出结果:
{'a': 'c', 'b': 'c', 'n': 'q'}