def reducefn(*dicts): #collects multiple arguments and stores in dicts
for dic in dicts: #go over each dictionary passed in
for k,v in dic.items(): #go over key,value pairs in the dic
print(k,v)
reducefn({'practical': 1, 'volume': 1, 'physics': 1} ,{'practical': 1, 'volume': 1, 'chemistry': 1})
プロデュース
>>>
physics 1
practical 1
volume 1
chemistry 1
practical 1
volume 1
さて、あなたの実装に関して:
def reducefn(k, v):
上記の関数シグネチャは 2 つの引数を取ります。関数に渡される引数は、それぞれk
およびを介してアクセスされv
ます。したがって、 を呼び出すと、割り当てられ、割り当てられreducefn({"key1":"value"},{"key2":"value"})
ます。k
{"key1":"value"}
v
{"key2":"vlaue"}
次のように呼び出そうとするとreducefn(dic1,dic2,dic3,...)
、の宣言/署名で定義されている許容数を超えるパラメーターを渡していますreducefn
。
for k,val in (k,v):
ここで、 に 2 つの辞書を渡したとすると、 とreducefn
の両方が辞書になります。上記の for ループは次と同等です。k
v
>>> a = {"Name":"A"}
>>> b = {"Name":"B"}
>>> for (d1,d2) in (a,b):
print(d1,d2)
次のエラーが発生します。
ValueError: need more than 1 value to unpack
これは、for ループが呼び出されたときに本質的にこれを行っているために発生します。
d1,d2=a
REPL で試してみると、このエラーが発生することがわかります。
>>> d1,d2=a
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
d1,d2=a
ValueError: need more than 1 value to unpack
これを行うことができます:
>>> for (d1,d2) in [(a,b)]:
print(d1,d2)
{'Name': 'A'} {'Name': 'B'}
タプル (a,b)
を に割り当てd1,d2
ます。これはアンパックと呼ばれ、次のようになります。
d1,d2 = (a,b)
ただし、 for ループでは、 , が最初に行ったものと同じものを表すことfor k,val in (k,v):
になるため、意味がありません。代わりに、辞書のキーと値のペアを調べる必要があります。しかし、n個の辞書に対処する必要があるため、関数定義を再考する必要があります。k
val
k
v
したがって:
def reducefn(*dicts):
次のように関数を呼び出すと:
reducefn({'physics': 1},{'volume': 1, 'chemistry': 1},{'chemistry': 1})
*dicts
最終的に次のような方法で引数を収集しますdicts
。
({'physics': 1}, {'volume': 1, 'chemistry': 1}, {'chemistry': 1})
ご覧のとおり、関数に渡された 3 つの辞書が 1 つのタプルにまとめられています。次に、タプルを反復処理します。
for dic in dicts:
これで、反復ごとに dic が渡された辞書の 1 つになったので、次に進み、その中のキーと値のペアを出力します。
for k,v in dic.items():
print(k,v)