10

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

[{'mykey1':'myvalue1', 'mykey2':'myvalue2'}, {'mykey1':'myvalue1a', 'mykey2':'myvalue2a'}]

キーがmykey1と等しいすべての辞書からすべてのキー値のペアを削除する必要があります。ループしてdelステートメントを使用することでこれを行うことができますが、リスト内包表記またはラムダを使用して新しいリストを作成し、キーがmykey1であるすべてのキーと値のペアを削除する方法を考えています。

どうもありがとう

4

5 に答える 5

23

本当にリスト内包表記を使用したい場合は、辞書内包表記と組み合わせてください。

[{k: v for k, v in d.iteritems() if k != 'mykey1'} for d in mylist]

.iteritems()Python 3を使用.items()している場合はの代わりになります。

Python 2.6 以下では、以下を使用する必要があります。

[dict((k, v) for k, v in d.iteritems() if k != 'mykey1') for d in mylist]

{key: value ...}dict 内包構文は Python 2.7 および 3 でのみ導入されたためです。

于 2012-11-06T15:33:05.267 に答える
5
def new_dict(old_dict):
    n = old_dict.copy()
    n.pop('mykey1',None)
    return n

new_list_of_dict = map(new_dict,list_of_dict)

また

new_list_of_dict = [ new_dict(d) for d in list_of_dict ]

を使用するのではなく、キーが存在しない場合を抑制するため、delを選択しました。dict.poppopKeyError


本当に特定のキーだけを取得したい場合、これは少し簡単になります。

from operator import itemgetter
tuple_keys = ('key1','key2','key3')
get_keys = itemgetter(*tuple_keys)
new_dict_list = [ dict(zip(tuple_keys,get_keys(d)) for d in old_dict_list ] 

KeyErrorキーが古い辞書にない場合に発生します

または:

new_dict_list = [ dict( (k,d.get(k,None)) for k in tuple_keys ) for d in old_dict_list ]

古い辞書にないkey:None場合も追加されます。keyそれを望まない場合はNone、次のようにします。

new_dict_list = [ dict( (k,d[k]) for k in tuple_keys if k in d) for d in old_dict_list ]

含める/除外する辞書の割合と辞書のサイズによっては、@MartijnPieters によるソリューションよりもわずかに高速になる場合があります。

于 2012-11-06T15:32:47.023 に答える
0

[d.pop('mykey1', None) for d in list]

于 2012-11-06T15:35:41.217 に答える