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)}})

この次の部分は機能しますが、マップを使用して関数を「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などがあるかどうか知りたいです。


OK ...これに遭遇した人のために-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))

これで、関数(addnodeまたはaddnodes)を呼び出してdictを更新できます。

4

1 に答える 1

2

入力を1対1で結果のリストに変換するのではなく、入力を1つの結果に減らすため、ではなく、必要reduceです。map

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

それはpython2.6でした。Python3バージョンは同じように機能しますreduceが、functools現在は次のようになっています。

>>> 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 に答える