1

当一个人不使用方法时,什么是最好的,实现以下的方法。

  1. 具有将项目添加到字典的单个功能
  2. 向字典添加多个项目时使用该功能
  3. 这会让一切都变得超级慢吗?

以下作品,我对使用它不是很认真,但对可能的事情很感兴趣。

创建和更新字典的简单函数。

from collections import defaultdict
from functools import partial

def addfoo(mydict, foo):
    x,y,z = foo
    mydict[x].add((y,z))
    mydict[y].add((x,z))
    return mydict

makemydict = partial(addfoo, defaultdict(set))

foo = ('foo','bar',1)

mydict = makemydict(foo)

print(mydict)
# defaultdict(<class 'set'>, {'foo': {('bar', 1)}, 'bar': {('foo', 1)}})

虽然下一部分有效,但我想知道是否有一种方法可以使用 map 来在“foos”(复数)上运行该函数。但是由于 addfoo 函数返回一个值,它怎么能被映射。以下工作,但还有其他方法吗?

def addfoos(mydict, foos):
    for foo in foos:
        mydict = addfoo(mydict,foo)
    return mydict

makemany = partial(addfoos, defaultdict(set))

foos = { ('foo','bar',1),
         ('bar','baz',0) }

mydict = makemany(foos)

print(mydict)
# defaultdict(<class 'set'>, {'baz': {('bar', 0)}, 'foo': {('bar', 1)}, 'bar': {('foo', 1), ('baz', 0)}})

事实上,它可以工作......但我很好奇python是否有 fmap 或类似的。


好的......对于任何偶然发现这一点的人——使用reduce!

以下,虽然有不同的变量正是我的目标:

from collections import defaultdict
from functools import partial
from functools import reduce

def addnode(graph, node):
    x,y,z = node
    graph[x].add((y,z))
    graph[y].add((x,z))
    return graph

def addnodes(graph, nodes):
    return reduce(addnode, nodes, graph)

graphnode  = partial(addnode, defaultdict(set))
graphnodes = partial(addnodes, defaultdict(set))

现在,可以调用函数 (addnodeaddnodes) 来更新字典。

4

1 回答 1

2

您想要reduce,而不是map,因为您将输入减少为单个结果,而不是将它们一对一地转换为结果列表。

>>> reduce(addfoo, foos, defaultdict(set))
defaultdict(<type 'set'>, {'baz': set([('bar', 0)]), 'foo': set([('bar', 1)]), 'bar': set([('foo', 1), ('baz', 0)])})

那是python 2.6。Python3 版本的工作原理相同,但现在reducefunctools

>>> from functools import reduce
>>> reduce(addfoo, foos, defaultdict(set))
defaultdict(<class 'set'>, {'baz': {('bar', 0)}, 'foo': {('bar', 1)}, 'bar': {('foo', 1), ('baz', 0)}})
于 2012-06-16T18:51:59.143 回答