2017-03-15 5 views
-1

辞書のリストが2つある場合、新しいリストの辞書に元のリストのキーと値のペアの組み合わせがある辞書の新しいリストを作成します。Pythonで辞書の2つのリストに加わる

私はSQLで左結合のようなものを想像しています。ここで

は私の二つのリストの例である:DictList1

  • 各辞書について
    DictList1 = [{workbookname: workbook1, groupid: id1, capabilityname: capability1}, 
    {workbookname: workbook1, groupid: id1, capabilityname: capability2} 
    , ...] 
    DictList2 = [{groupid: id1, groupname: name1} 
    , {groupid: id2, groupname, name2} 
    , ...] 
    NewList = [{workbookname: workbook1, groupname: name1, capabilityname: capability1} 
    , {workbookname: workbook1, groupname: name1, capabilityname: capability2} 
    , ...] 
    

    ので

    • 私はgroupid上の一致を検出するまでDictList2を検索します。
    • 次に、その辞書にグループ名のキーと値のペアを追加します。
    • に保存します。

    これはPythonで可能なことですか?

    combined = [dict(by_group.get(d['groupid'], {}), **d) for d in DictList1] 
    

    by_group = {} 
    for d in DictList2: 
        by_group[d['groupid']] = d 
    

    は今、あなたは第二のリストからの出力を生成することができます

  • 答えて

    0

    は、あなたが最初のグループIDをキーと辞書にリストの1をマッピングする必要があり、これを効率的に行うために、

    私はあまり知られていないトリックを使用して2つの辞書を新しい単一の辞書に結合します。dict()groupidの辞書のコピーを作成し、そのコピーを更新するためにキーワード引数としてdを使用します。 3.5以降が{**by_group.get(d['groupid'], {}), **d}、専用のマージの構文を持ってい

    def merge_dicts(*dicts): 
        res = {} 
        for d in dicts: 
         res.update(d) 
        return res 
    
    combined = [merge_dicts(by_group.get(d['groupid'], {}), d) for d in DictList1] 
    

    のPython:あなたはそれが読みにくいことを発見した場合は、別の関数を使用します。

    このすべてがDictList2groupid値はユニークをしていることを前提とし、あなたはDictList2には一致groupid値がない場合でも、DictList1ごと辞書をcombinedで出力を作成すること。

    デモ:私は別の関数を実装しましたが、私は、エラーTypeError例外を取得しています

    >>> DictList1 = [ 
    ...  {'workbookname': 'workbook1', 'groupid': 'id1', 'capabilityname': 'capability1'}, 
    ...  {'workbookname': 'workbook1', 'groupid': 'id1', 'capabilityname': 'capability2'}, 
    ... ] 
    >>> DictList2 = [{'groupid': 'id1', 'groupname': 'name1'}, {'groupid': 'id2', 'groupname': 'name2'}] 
    >>> by_group = {} 
    >>> for d in DictList2: 
    ...  by_group[d['groupid']] = d 
    ... 
    >>> def merge_dicts(*dicts): 
    ...  res = {} 
    ...  for d in dicts: 
    ...   res.update(d) 
    ...  return res 
    ... 
    >>> [merge_dicts(by_group.get(d['groupid'], {}), d) for d in DictList1] 
    [{'groupname': 'name1', 'workbookname': 'workbook1', 'groupid': 'id1', 'capabilityname': 'capability1'}, {'groupname': 'name1', 'workbookname': 'workbook1', 'groupid': 'id1', 'capabilityname': 'capability2'}] 
    >>> from pprint import pprint 
    >>> pprint(_) 
    [{'capabilityname': 'capability1', 
        'groupid': 'id1', 
        'groupname': 'name1', 
        'workbookname': 'workbook1'}, 
    {'capabilityname': 'capability2', 
        'groupid': 'id1', 
        'groupname': 'name1', 
        'workbookname': 'workbook1'}] 
    
    +0

    :リストインデックスは(私のメインで)最後の行にstrを、整数であってはならないこと。 –

    +0

    @JeremyReal: 'd'はリストオブジェクトであり、辞書ではないことを示しています。 'DictList1'に辞書しかないのは確実ですか? –

    +0

    内側のリストを除いて最も外側のリストが空である[[{}]]のような辞書を持つ2つのリストがあると思います。私はどのようにそれをしたのか分かりませんが、それはおそらく問題です。私はそれをチェックします。ありがとう! –

    関連する問題