1

出于好奇,是否可以将以下逻辑编写为一个很好的 dict 理解?

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}

是否有更优雅的可能?

4

7 回答 7

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'}
于 2014-07-29T13:50:52.293 回答
4

使用嵌套列表推导:

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

输出:

{'a': 'c', 'b': 'c', 'n': 'q'}
于 2014-07-29T13:40:09.397 回答
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'}
于 2014-07-29T13:48:26.957 回答
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'}
于 2014-07-29T13:42:59.210 回答
0

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

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

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

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

dict(helper(line) for line in a)

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

于 2014-07-29T13:53:15.700 回答
0

使用没有拆分的嵌套列表推导。

>>> {line[0]:line[-1] for line in a}
{'a': 'c', 'b': 'c', 'n': 'q'}
于 2014-07-29T13:56:12.830 回答
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'}
于 2014-07-29T14:06:23.410 回答