8

次のようなリストがあります。

lis = ['Date', 'Product', 'Price']

私はそれを比較したい:

dict = {'Date' : '2013-05-01', 'Salary' : '$5000', 'Product' : 'Toys', 'Price' : '$10', 'Salesman' : 'Smith'}

リストの各項目を辞書のキーと比較して、新しい辞書を作成したい。
私が試したことは次のとおりです。

n = {}
for k,v in dict.items():
    for i in lis:
        if i==k:
            n[k] = v

出力:

n = {'Date' : '2013-05-01', 'Product' : 'Toys', 'Price' : '$10'}

これは機能しますが、ジェネレーターを介して実行したいのですが、誰かがそれを手伝ってくれますか?

4

3 に答える 3

13

代わりにセットとして扱い、ディクショナリ ビューと交差lisを使用できるようにします。

# python 2.7:
n = {k: d[k] for k in d.viewkeys() & set(lis)}

# python 3:
n = {k: d[k] for k in d.keys() & set(lis)}

inまたは、次に対するテストで単純な辞書内包表記を使用できますd

# python 2.6 or older:
n = dict((k, d[k]) for k in lis if k in d)

# python 2.7 and up:
n = {k: d[k] for k in lis if k in d}

lisこれは、 のすべての値がにあるわけではないことを前提としていますd。それらが常に存在する場合は、if k in dテストを削除できます。

特定のケースでは、2 番目の形式の方がはるかに高速です。

>>> from timeit import timeit
>>> timeit("{k: d[k] for k in d.viewkeys() & s}", 'from __main__ import d, lis; s=set(lis)')
2.156520128250122
>>> timeit("{k: d[k] for k in lis if k in d}", 'from __main__ import d, lis')
0.9401540756225586
于 2013-03-13T12:28:06.337 に答える
1
filtered_dict = dict((k, original_dict[k]) for k in lis if k in original_dict)

または、2.7+ をお持ちの場合:

filtered_dict = {k: original_dict[k] for k in lis if k in original_dict}

ジェネレーターを使用する場合:

item_generator = ((k, original_dict[k]) for k in lis if k in original_dict)

ジェネレーターは(key, value)ペアを生成します。

于 2013-03-13T12:28:56.667 に答える