web-dev-qa-db-ja.com

Python:キーの値に基づいて辞書をスライスする方法は?

次のように構築された辞書があるとします。

d={0:1, 1:2, 2:3, 10:4, 11:5, 12:6, 100:7, 101:8, 102:9, 200:10, 201:11, 202:12}

そして、私はサブディクショナリーを作成したいと思いますd1dd1には次のキーが含まれています:0, 1, 2, 100, 101, 102。最終的な出力は次のようになります。

d1={0:1, 1:2, 2:3, 100:7, 101:8, 102:9}

実際のディクショナリに2,000,000を超えるアイテムが含まれている場合、Pythonで効率的な方法はありますか?

この質問は、スライスが特定の不等式ルールに従う必要がある場合、および最終結果が同じ辞書にまとめられたスライスの束。

6
FaCoffee

辞書内包表記は次のもので使用できます。

_d = {0:1, 1:2, 2:3, 10:4, 11:5, 12:6, 100:7, 101:8, 102:9, 200:10, 201:11, 202:12}
keys = (0, 1, 2, 100, 101, 102)
d1 = {k: d[k] for k in keys}
_

python 2.7では、(python 3.x replace it.ifilter(...) by filter(...))でキーを計算することもできます:

_import itertools as it

d = {0:1, 1:2, 2:3, 10:4, 11:5, 12:6, 100:7, 101:8, 102:9, 200:10, 201:11, 202:12}
d1 = {k: d[k] for k in it.ifilter(lambda x: 1 < x <= 11, d.keys())}
_
10

サブ辞書を作成する簡単な方法の1つは、operator.itemgetterを使用することです。この関数は複数の引数を取り、指定されたイテラブルの対応する要素を含むタプルを返す新しい関数を返します。

from operator import itemgetter as ig

k = [0, 1, 2, 100, 101, 102]
# ig(0,1,2,100,101,102) == lambda d : (d[0], d[1], d[2], d[100], d[101], d[102])
d1 = dict(Zip(k, ig(*k)(d)))
3
chepner