如何将我的for循环重构为python字典理解?

时间:2018-07-22 01:23:01

标签: python python-3.x dictionary

我正在使用Python 3.6。我编写了以下代码,这是一个for循环:

编辑:当我写下var l时我犯了一个错误,所以我在这里重新输入。感谢@Ender Look !!

l = [['a','1'], ['a','2'], ['a','3']]
d = {}
for i in l:
    d[i[0]] = d.get(i[0], '') + '\t' + i[1]
print (d)

所以,结果就是我想要的: {'a':'\ t1 \ t2 \ t3'}

然后我将上面的代码重构为理解力:

dict2 = {} dict2 = {i[0]: dict2.get(i[0], '') + '\t' + i[1] for i in l} print(dict2)

我虽然他们应该返回相同的输出。但是dict2是:

{'a':'\ t3'}

我想知道我的字典理解是怎么回事?非常感谢!

3 个答案:

答案 0 :(得分:5)

您不一定不需要在这里使用理解。您可以使用collections中的defaultdict

>>> from collections import defaultdict
>>> d = defaultdict(str)
>>> for li in l:
...  d[li[0]] += f'\t{li[1]}'
...
>>> d
defaultdict(<class 'str'>, {'a': '\t1\t2'})

答案 1 :(得分:3)

您的字典理解无法使用,因为它本身使用了.get

dict2 = {i[0]: dict2.get(i[0], '') + '\t' + i[1] for i in l}

直到整个字典理解结束,都不会将此新字典分配给您实际的dict2变量。因此,您的理解每次都会尝试从dict2.get(...)检索值,它总是从空字典dict2 = {}执行该函数。

可悲的是,我不知道(而且我不认为它存在)在字典理解自身上使用.get的方法,因为变量dict2不会在“实时”(直到理解结束)。或至少据我所知,我的谦虚知识并不完美。

答案 2 :(得分:0)

是的,您可以将其作为单个dict理解。

{k: v
 for d in [{}]
 for k, v in [d.__setitem__(k, d.get(k, '') + '\t' + v) or d 
              for k, v in [['a','1'], ['a','2'], ['a','3']]][-1].items()}

你不应该。

请注意,无论如何,我们必须如何创建对内部字典d的引用,因为您的算法在构建时必须在字典中查找内容。。甚至对于的外在理解是什么?而且,我们将丢弃内部列表组件中除最后一个元素之外的所有元素。

使用普通的for循环更加清晰

d = {}
for k, v in [['a','1'], ['a','2'], ['a','3']]:
    d[k] = d.get(k, '') + '\t' + v

使用正确的工具进行工作。