11

入力として多数または少数の辞書を受け取る関数を作成しようとしています。私は次のコードを使用しています:

def merge_many_dics(dic1,dic2,dic3=True,dic4=True,dic5=True,dic6=True,dic7=True,dic8=True,dic9=True,dic10=True):
"""
Merging up to 10 dictionaries with same keys and different values
:return: a dictionary containing the common dates as keys and both values as values
"""
manydics = {}
for k in dic1.viewkeys() & dic2.viewkeys() & dic3.viewkeys() & dic4.viewkeys() & dic5.viewkeys() & dic6.viewkeys()\
        & dic7.viewkeys() & dic8.viewkeys() & dic9.viewkeys() & dic10.viewkeys():
    manydics[k] = (dic1[k], dic2[k],dic3[k],dic4[k],dic5[k],dic6[k],dic7[k],dic8[k],dic9[k],dic10[k])

return manydics

引数 dic3、dic4、dic5 などを「True」に等しくしようとしていることに注意してください。したがって、それらが指定されておらず、関数で呼び出された場合、何も起こりません。ただし、次のエラーが発生します。

Traceback (most recent call last):
File "/Users/File.py", line 616, in <module>
main_dic=merge_many_dics(dic1,dic2,dic3,dic4)
File "/Users/File.py", line 132, in merge_many_dics
& dic7.viewkeys() & dic8.viewkeys() & dic9.viewkeys() & dic10.viewkeys():
AttributeError: 'bool' object has no attribute 'viewkeys'

私の旅を教えてくれる人はいますか?

4

5 に答える 5

13

任意の引数リストを使用すると、任意の数の引数で関数を呼び出すことができます。

>>> def merge_many_dics(*dicts):
...     common_keys = reduce(lambda a, b: a & b, (d.viewkeys() for d in dicts))
...     return {key: tuple(d[key] for d in dicts) for key in common_keys}
...
>>> merge_many_dics({1:2}, {1:3}, {1:4, 2:5})
{1: (2, 3, 4)}
于 2015-12-13T13:12:25.563 に答える
6

args 構文を試す必要があります。

def merge_many_dics(*args):
   iterate over your args to join them

その後、好きなだけ引数を指定して関数を呼び出すことができます。

*args を持つ関数は次のようになります。

   def print_all(name, *args):
      print "Hello", name, "here are your args"
      for arg in args:
         print arg

   print_all("Claus", "car", "boat", "house")

これは印刷されます:

Hello Clause here are your args

car
boat
house
于 2015-12-13T13:02:30.613 に答える
4

これは、@falsetruの回答に基づいてoperator.and_関数を使用したPython 3.xの回答です。

>>> from functools import reduce
>>> import operator
>>> def merge_many_dicts(*dicts):
...     common_keys = reduce(operator.and_, (d.keys() for d in dicts))
...     return {key: tuple(d[key] for d in dicts) for key in common_keys}
... 
>>> merge_many_dicts({1:2}, {1:3}, {1:4, 2:5})
{1: (2, 3, 4)}
于 2015-12-13T13:26:50.700 に答える
0

エラーが示すように、ブール値のキーを表示できません。別名、True.viewkeys() は機能しません。デフォルトの辞書を空に変更し、次のようにします。

def merge_many_dics(dic1,dic2,dic3={},dic4={},dic5={},dic6={},dic7={},dic8={},dic9={},dic10={}):
    """
    Merging up to 10 dictionaries with same keys and different values
    :return: a dictionary containing the common dates as keys and both values as values
    """
    manydics = {}
    for k in dic1.viewkeys() & dic2.viewkeys() & dic3.viewkeys() & dic4.viewkeys() & dic5.viewkeys() & dic6.viewkeys()\
            & dic7.viewkeys() & dic8.viewkeys() & dic9.viewkeys() & dic10.viewkeys():
        manydics[k] = (dic1[k], dic2[k],dic3[k],dic4[k],dic5[k],dic6[k],dic7[k],dic8[k],dic9[k],dic10[k])

    return manydics

これは、すべてのキーのリストを作成し、各項目を追加する実装です。さらに最適化できると確信していますが、非常に読みやすいです。

def merge_many_dicts(*args):
    """
    Merging all dictionaries suposing all dictionaries share keys
    :return: a dictionary containing the common dates as keys and both values as values
    """
    manydicts = {}
    for k in args:
        for key in k.iterkeys():
            manydicts[key] = []
    for k in args:
        for key, value in k.iteritems():
            manydicts[key].append(value)

    return manydicts
于 2015-12-13T13:05:35.180 に答える
0

次のコードを使用して、関数でこれらのパラメーターを初期化できます

def merge_many_dics(dic1, dic2, dic3=None, dic4=None, dic5=None, dic6=None, dic7=None, dic8=None, dic9=None,
                    dic10=None):
    """
    Merging up to 10 dictionaries with same keys and different values
    :return: a dictionary containing the common dates as keys and both values as values
    """
    for item in locals().items():
        if item is None:
            item = dic1

    manydics = {}
    for k in dic1.viewkeys() & dic2.viewkeys() & dic3.viewkeys() & dic4.viewkeys() & dic5.viewkeys() & dic6.viewkeys() \
            & dic7.viewkeys() & dic8.viewkeys() & dic9.viewkeys() & dic10.viewkeys():
        manydics[k] = (dic1[k], dic2[k], dic3[k], dic4[k], dic5[k], dic6[k], dic7[k], dic8[k], dic9[k], dic10[k])

    return manydics
于 2015-12-13T13:13:16.693 に答える