1

更新: 明確にするために、「name」と「last」のキー値を確認し、これらがまだリストにない場合にのみ追加したいと思います。

私は持っている:

lst = [{'name':'John', 'last':'Smith'.... .... (other key-values)... }, 
{'name':'Will', 'last':'Smith'... ... (other key-values)... }]

既存の辞書とまったく同じでない場合にのみ、このリストに新しい辞書を追加したいと思います。

言い換えると:

dict1 = {'name':'John', 'last':'Smith'} # ==> wouldn't be appended

しかし...

dict2 = {'name':'John', 'last':'Brown'} # ==> WOULD be appended

誰かがこれを行う最も簡単な方法と、ソリューションで何が起こっているかを英語で説明できますか? ありがとう!

参照: Python: リスト要素が辞書のキーであるかどうかを確認する

4

4 に答える 4

4

辞書に他のキーが含まれていても、2つのキーのみをチェックする方法を要求したため:

name_pairs = set((i['name'], i['last']) for i in lst)
if (d['name'], d['last']) not in name_pairs:
    lst.append(d)
于 2012-06-27T03:42:42.200 に答える
0

それを実行してリストを返す小さなメソッドを書くこともできます

def update_if_not_exist(lst, val):
    if len([d for d in lst if (d['name'], d['last']) == (val['name'], val['last'])]) == 0:
        lst.append(val)
    return lst

lst = update_if_not_exist(lst, dict1)
lst = update_if_not_exist(lst, dict2)

元のリストをフィルタリングして名前と最後のキーを一致させ、結果が空かどうかを確認します。

于 2012-06-27T04:38:46.410 に答える
0

このリスト内包表記を使用して、リストにすべてを追加してこれを実行するだけで実行できます。

lst.append(dict1)
lst.append(dict2)
[dict(y) for y in set(tuple(x.items()) for x in lst)]

出力は次のとおりです。

[
    {'last': 'Smith', 'name': 'John'},
    {'last': 'Brown', 'name': 'John'},
    {'last': 'Smith', 'name': 'Will'}
]

この方法を使用すると、フィールドを追加できますが、引き続き機能します。

于 2012-06-27T03:49:41.553 に答える
0
>>> class Person(dict):
...     def __eq__(self, other):
...         return (self['first'] == other['first'] and
...                 self['second'] == other['second'])
...     def __hash__(self):
...         return hash((self['first'], self['second']))

>>> l = [{'first': 'John', 'second': 'Smith', 'age': 23},
...         {'first': 'John', 'second': 'Smith', 'age': 30},
...         {'first': 'Ann', 'second': 'Rice', 'age': 31}]

>>> l = set(map(Person, l))
>>> print l
set([{'first': 'Ann', 'second': 'Rice', 'age': 31},
    {'first': 'John', 'second': 'Smith', 'age': 23}])

Person クラスのインスタンスは、単純な dict として使用できます。

于 2012-06-27T05:26:14.683 に答える