2

私はいくつかの同様の答えを見てきましたが、この場合に固有の何かを見つけることができません:

私はこのような辞書のリストを持っています:

[
 {"element":Bla, "version":2, "date":"12/04/12"},
 {"element":Bla, "version":2, "date":"12/05/12"},
 {"element":Bla, "version":3, "date":"12/04/12"}
]

実際の辞書には他にも多くのキーがありますが、私がやろうとしているのは、日付を除いて、まったく同じキーペア値を持つすべてのエントリを削除することです。つまり、すべての重複を削除します(日付のみが異なるため、実際には正確な重複ではありません)。この場合、私が期待するのは次のとおりです。

[
 {"element":Bla, "version":2, "date":"12/04/12"},
 {"element":Bla, "version":3, "date":"12/04/12"}
]
4

5 に答える 5

6

あなたは、質問で言及されていない辞書に他の多くのキーがあると言います。

O(n)必要なことを行うためのアルゴリズムは次のとおりです。

>>> seen = set()
>>> result = []
>>> for d in dicts:
...     h = d.copy()
...     h.pop('date')
...     h = tuple(h.items())
...     if h not in seen:
...         result.append(d)
...         seen.add(h)

>>> pprint(result)
[{'date': '12/04/12', 'element': 'Bla', 'version': 2},
 {'date': '12/04/12', 'element': 'Bla', 'version': 3}]

hdictのコピーです。dateキーは。で削除されpopます。

次にtuple、に追加できるハッシュ可能なタイプとして作成されsetます。

hこれまでに見たことがない場合は、に追加しresultて追加しseenます。への追加seenO(1)、ルックアップ()と同様h not in seenです。

最後に、result定義された値に関して一意の要素のみが含まれhます。

于 2013-03-19T22:56:26.583 に答える
3

からの「unique_everseenレシピitertoolsを使用して、新しいを作成できますlist

list(unique_everseen(original_list, key=lambda e: '{element}@{version}'.format(**e)))

あなたの「キー」がlambda私が書いたよりも広い必要がある場合(より多くの値を収容するために)、それはおそらく関数に抽出する価値があります:

def key_without_date(element):
    return '@'.join(["{}".format(v) for k,v in element.iteritems() if k != 'date'])

list(unique_everseen(original_list, key=key_without_date))
于 2013-03-19T22:50:32.567 に答える
1

ひどい変数名についてお詫びします。おそらくもっとクリーンな方法がありますが、これはうまくいくはずです

seen = {(item["element"], item["version"]): False for item in mylist}

output = []
for item in mylist:
    item_key = (item["element"], item["version"])
    if not seen[item_key]:
        output.append(item)
        seen[item_key] = True
于 2013-03-19T22:50:17.547 に答える
1

パンダはこれをすばやく解決できます。

import pandas as pd
Bla = "Bla"
d = [
{"element":Bla, "version":2, "date":"12/04/12"},
{"element":Bla, "version":2, "date":"12/05/12"},
{"element":Bla, "version":3, "date":"12/04/12"}
]
df = pd.DataFrame(d)
df[~df.drop("date", axis=1).duplicated()]

出力:

       date element  version
0  12/04/12     Bla        2
2  12/04/12     Bla        3
于 2013-03-19T22:56:16.227 に答える
0

これは機能します:

LoD=[
{"element":'Bla', "version":2, 'list':[1,2,3], "date":"12/04/12"},
{"element":'Bla', "version":2, 'list':[1,2,3], "date":"12/05/12"},
{"element":'Bla', "version":3, 'list':[1,2,3], "date":"12/04/12"}
]

LoDcopy=[]
seen=set()


for d in LoD:
    dc=d.copy()
    del dc['date']
    s=dc.__str__()
    if s in seen: continue
    seen.add(s)
    LoDcopy.append(d)    

print LoDcopy 

プリント:

[{'date': '12/04/12', 'version': 2, 'list': [1, 2, 3], 'element': 'Bla'}, 
 {'date': '12/04/12', 'version': 3, 'list': [1, 2, 3], 'element': 'Bla'}]
于 2013-03-19T23:13:32.470 に答える