在字典推导中优雅地临时赋值变量的方法?

2 投票
7 回答
1175 浏览
提问于 2025-04-18 15:11

出于好奇,能不能把下面的逻辑用一个漂亮的字典推导式写出来呢?

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

撰写回答