myDict = {}
for item in myTupleList:
if item[1] in myDict:
myDict [ item[1] ] += item[2]
else:
myDict [ item[1] ] = item[2]
但是在看了这个问题的答案或者这两个问题的回答之后,我发现肯定有更简洁的方法来表达我想做的事情。如果这是一个重复的问题,我会删除它并提供链接。
myDict = {}
for item in myTupleList:
if item[1] in myDict:
myDict [ item[1] ] += item[2]
else:
myDict [ item[1] ] = item[2]
但是在看了这个问题的答案或者这两个问题的回答之后,我发现肯定有更简洁的方法来表达我想做的事情。如果这是一个重复的问题,我会删除它并提供链接。
from collections import defaultdict
myDict = defaultdict(int)
for item in myTupleList:
myDict[item[1]] += item[2]
defaultdict
类似于一个字典,但如果你尝试获取一个不存在的键,则会填充由可调用函数返回的值 - 在这种情况下,int
返回没有参数时的0。
更新:感谢@gnibbler提醒我,但元组可以在for循环中解包:
from collections import defaultdict
myDict = defaultdict(int)
for _, key, val in myTupleList:
myDict[key] += val
_
、key
和val
。在Python中,_
是一个常见的占位符名称,用于指示该值并不重要。使用它,我们可以避免复杂的item[1]
和item[2]
索引。如果myTupleList
中的元组大小不一致,我们就不能依赖它,但我敢打赌它们是一样的。myTupleList
是一个包含三个元素的元组,我们只需要后两个元素。)reduce
会让人难以理解。而且我的解决方案还稍微有点问题,但我会发布正确的版本。 - Omnifariousfrom collections import defaultdict
myDict = defaultdict(int)
for _, key, value in myTupleList:
myDict[key] += value
myTupleList
是一个包含三个元素的元组。你会得到ValueError: too many values to unpack
的错误。 - Troy J. FarrellmyDict = reduce(lambda d, t: (d.__setitem__(t[1], d.get(t[1], 0) + t[2]), d)[1], myTupleList, {})
它看起来很丑很差,但是它的工作原理如下。
reduce的第一个参数(因为不清楚)是lambda d, t: (d.__setitem__(t[1], d.get(t[1], 0) + t[2]), d)[1]
。稍后我会详细讲解,但现在,我只会称其为joe
(无意冒犯任何名叫Joe的人)。reduce函数基本上是这样工作的:
joe(joe(joe({}, myTupleList[0]), myTupleList[1]), myTupleList[2])
这是一个三元素列表。可以看到,它基本上使用第一个参数将每个结果累积到最终答案中。在这种情况下,最终答案就是您想要的字典。
现在来看joe
本身。这是joe
的def
:
def joe(myDict, tupleItem):
myDict[tupleItem[1]] = myDict.get(tupleItem[1], 0) + tupleItem[2]
return myDict
很遗憾,在Python的lambda
中不允许使用任何形式的=
或return
,因此必须绕过这个问题。我通过直接调用dict
的__setitem__
函数来解决缺少=
的问题。我通过创建一个包含__setitem__
返回值和字典的元组,然后返回包含字典的元素的元组来解决缺少返回值的问题。我将逐步修改joe
,以便您可以看到我是如何完成这个任务的。
首先,删除=
:
def joe(myDict, tupleItem):
# Using __setitem__ to avoid using '='
myDict.__setitem__(tupleItem[1], myDict.get(tupleItem[1], 0) + tupleItem[2])
return myDict
def joe(myDict, tupleItem):
return (myDict.__setitem__(tupleItem[1], myDict.get(tupleItem[1], 0) + tupleItem[2]),
myDict)[1]
在我的Python编程中,我经常遇到使用reduce
和dict
的情况。 我认为,dict
可以使用成员函数reduceto(keyfunc, reduce_func, iterable, default_val=None)
。 keyfunc
将从可迭代对象中获取当前值并返回键。 reduce_func
将获取字典中的现有值和可迭代对象中的值,并返回字典的新值。 如果字典缺少键,则default_val
将传递给reduce_func
。 返回值应该是字典本身,因此您可以执行以下操作:
myDict = dict().reduceto(lambda t: t[1], lambda o, t: o + t, myTupleList, 0)
可能不是特别易读,但它应该可以工作:
fks = dict([ (v[1], True) for v in myTupleList ]).keys()
myDict = dict([ (fk, sum([ v[2] for v in myTupleList if v[1] == fk ])) for fk in fks ])