2017-08-28 3 views
1

SQLAlchemyを使ってクエリを作成しました。このクエリジェネレータは、ルールのリストを持つ4つのオブジェクトを返します。各ルールは次のようになります:{'type': u'psome_type', 'options': {}, 'weight': 1.0}。私は一意のdictだけを含む1つの反復可能な要素を取得したい。 I)は、(設定を使用してみてください:ユニークな辞書だけを残すために辞書のリストをフィルタリングする方法

rule_sets = DBSession.query(ProductSortRuleSet).all() 
    rules = set() 
    for i in rule_sets: 
     for j in i.rules: 
      rules.update(j) 

しかし、我々はset.update辞書に渡すとき、それが唯一のキーで更新しますが、私はすべての辞書で更新します。

どうすればいいですか?

+0

はキーでソートされたタプルのタプルにdictsを変換するようにしてください。次に、それらをセットに追加して、ユニークな結果を得ます。 –

答えて

1

ループは、異なる辞書のすべてのキーをsetに追加します。代わりにrules.update(d.items())を実行すると、すべての項目のうちsetが返され、dictからすべての項目を再作成できます(異なる値の重複キーがないと仮定します)。しかし、それはあなたが望むものではないようです。

>>> lst = [{"foo": 42, "bar": 23}, {"foo": 3.14}, {"bar": 23, "foo": 42}] 
>>> s = set() 
>>> for d in lst: 
...  s.update(d.items()) 
...  
>>> dict(s) 
{'foo': 3.14, 'bar': 23} 

"foo": 42の入力が消えたことに注意してください。代わりに、あなたは、辞書の項目からハッシュ可能frozensetを作成setのものを収集し、それらから新しい独自の辞書を作成することができます。

>>> lst = [{"foo": 42, "bar": 23}, {"foo": 3.14}, {"bar": 23, "foo": 42}] 
>>> [dict(x) for x in set(frozenset(d.items()) for d in lst)] 
[{'foo': 3.14}, {'foo': 42, 'bar': 23}] 
+0

ありがとう、私の大切な理由は、まず自分のリストを1つにまとめてからそれをfrozensetに変換する必要があります。 – Vladyslav

+0

@VladyslavUshakov非常に簡単に受け入れられ、この答えを受け入れられないことに気付きました。これは間違いですか、それとも間違ったことがありますか? (もちろん、あなたが答えを受け入れるかどうかは、好奇心をそそられるだけです。) –

関連する問題