1

2 要素のタプルをキーとする辞書が与えられた場合、キーに特定の要素が含まれるすべてのキーと値のペアを返したいと考えています。

たとえば、ディクショナリは次のようになります。

tupled_dict = {('a',1):1, ('a',2):0, ('b',1):1, ('c',4):0}

指定された要素が'a'である場合、返されるキーと値のペアは次のようになります。

('a',1):1, ('a',2):0

これを行うための最速のコードは何ですか?

編集:

さらに、関連するサブ質問として、キーの要素を指定して、そのようなキーと値のペアをすべて削除する最速の方法に興味があります。もちろん、上記の結果が得られたら、ループを使用して各辞書項目を 1 つずつ削除できますが、それを行う近道があるのではないかと思います。

4

3 に答える 3

3

それらを取得するには:

>>> {k: v for k, v in tupled_dict.iteritems() if 'a' in k}
{('a', 1): 1, ('a', 2): 0}

同様に、他のものを削除するには:

>>> tupled_dict = {k: v for k, v in tupled_dict.iteritems() if 'a' not in k}
>>> tupled_dict
{('b', 1): 1, ('c', 4): 0}
于 2012-07-20T00:53:34.417 に答える
2

パフォーマンスについてはテストしていませんが、最初に for ループを使用してベースラインを取得し、次にdict 内包表記を使用して別のベースラインを取得することをお勧めします。

>>> {k:v for k, v in tupled_dict.iteritems() if k[0] == 'a'}
{('a', 1): 1, ('a', 2): 0}
于 2012-07-20T00:48:48.610 に答える
1

このスニペットは、「a」がキー タプルの最初の要素でない場合でも機能します。

from operator import methodcaller

contains_a = methodcaller('__contains__', 'a')
keys = filter(contains_a, tupled_dict)
new_dict = dict(zip(keys, map(tupled_dict.get, keys))
于 2012-07-20T01:01:39.647 に答える