我正在使用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'}
我想知道我的字典理解是怎么回事?非常感谢!
答案 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
使用正确的工具进行工作。