4

私は次のように alist of tuplesと aを持ってdictionary of listsいます。

# List of tuples
lot = [('Item 1', 43), ('Item 4', 82), ('Item 12', 33), ('Item 10', 21)]

# dict of lists
dol = {

    'item_category_one': ['Item 3', 'Item 4'],
    'item_category_two': ['Item 1'],
    'item_category_thr': ['Item 2', 'Item 21'],
}

dolここで、任意のリスト内の項目がで指定されたタプルのいずれかに存在するルックアップを実行したいと考えていますlot。この要件が満たされている場合は、そのそれぞれのタプルに別の変数を追加したいと考えています。

現在、私はこれを次のように行っています(これは非常に非効率的で醜く見えます)。これを達成するための最も効率的きちんとした方法を知りたいです。可能性は何ですか?

PS:これを行っている間、順序を維持することも検討してlotいます。

merged = [x[0] for x in lot]

for x in dol:
    for item in dol[x]:
        if item in merged:
            for x in lot:
                if x[0] == item:
                    lot[lot.index(x)] += (True, )
4

1 に答える 1

5

まず、dol構造内にすべての値のセットを作成します。

from itertools import chain
dol_values = set(chain.from_iterable(dol.itervalues()))

メンバーシップのテストが効率的になり、リスト内包表記を使用できるようになりました。

[tup + (True,) if tup[0] in dol_values else tup for tup in lot]

デモ:

>>> from itertools import chain
>>> dol_values = set(chain.from_iterable(dol.itervalues()))
>>> dol_values
set(['Item 3', 'Item 2', 'Item 1', 'Item 21', 'Item 4'])
>>> [tup + (True,) if tup[0] in dol_values else tup for tup in lot]
[('Item 1', 43, True), ('Item 4', 82, True), ('Item 12', 33), ('Item 10', 21)]
于 2013-05-15T11:14:32.687 に答える