2017-08-24 9 views
0

私はリストにdictsを持ち、いくつかのdictsは同じです。私は重複したものを見つけたいと思っていて、重複している重複数を新しいリストや辞書に追加したい。Pythonは重複した辞書をリスト内に見つけ、数えてそれらを区切ります。

import itertools 

myListCombined = list() 
for a, b in itertools.combinations(myList, 2): 
    is_equal = set(a.items()) - set(b.items()) 
    if len(is_equal) == 0: 
     a.update(count=2) 
     myListCombined.append(a) 
    else: 
     a.update(count=1) 
     b.update(count=1) 
     myListCombined.append(a) 
     myListCombined.append(b) 

myListCombined = [i for n, i enumerate(myListCombine) if i not in myListCombine[n + 1:]] 

このコードはちょっとした作業ですが、リスト内に2つの重複したディクテーションがあります。この状況ではa.update(count = 2)は機能しません。 最後の行でsepareteした後に重複するdictsを削除していますが、うまくいくかどうかわかりません。

入力:

[{'name': 'Mary', 'age': 25, 'salary': 1000}, 
{'name': 'John', 'age': 25, 'salary': 2000}, 
{'name': 'George', 'age': 30, 'salary': 2500}, 
{'name': 'John', 'age': 25, 'salary': 2000}, 
{'name': 'John', 'age': 25, 'salary': 2000}] 

所望の出力:

[{'name': 'Mary', 'age': 25, 'salary': 1000, 'count':1}, 
{'name': 'John', 'age': 25, 'salary': 2000, 'count': 3}, 
{'name': 'George', 'age': 30, 'salary': 2500, 'count' 1}] 
+2

ご入力して所望の出力を投稿してください。 – Ajax1234

+0

編集、ありがとう@ Ajax1234 –

+0

下記の私の回答をご覧ください。 – Ajax1234

答えて

1

彼らはハッシュ可能になるように、必要に応じてあなたが最初のキーのfrozensetのに各辞書を変換し、以下、値のタプルを(試みることができますコレクションによって。カウン​​ター)。

import collections 
a = [{'a':1}, {'a':1},{'b':2}] 
print(collections.Counter(map(lambda x: frozenset(x.items()),a))) 

編集し、ご希望の入力/出力を反映するために:あなたはcollections.Counterを使用してカウント値をとり、その後、それぞれのfrozensetにCounterからカウント値を追加した後dictsを再構築することができます

from copy import deepcopy 

def count_duplicate_dicts(list_of_dicts): 
    cpy = deepcopy(list_of_dicts) 
    for d in list_of_dicts: 
     d['count'] = cpy.count(d) 
    return list_of_dicts 

x = [{'a':1},{'a':1}, {'c':3}] 
print(count_duplicate_dicts(x)) 
+0

私はcollections.Counterを使用するときにはまってしまいます.dictsはハッシュ可能ではありません。ご協力いただきありがとうございます! frozensetはサブスクリプトではないので、 'dict(frozenset)['salary']'を使って値に到達する必要がありますか? –

0

を:

from collections import Counter 

l = [dict(d | {('count', c)}) for d, c in Counter(frozenset(d.items()) 
                for d in myList).items()] 
print(l) 
# [{'salary': 1000, 'name': 'Mary', 'age': 25, 'count': 1}, 
# {'name': 'John', 'salary': 2000, 'age': 25, 'count': 3}, 
# {'salary': 2500, 'name': 'George', 'age': 30, 'count': 1}] 
0

あなたのdictデータが構造化されていて、dictの内容が単純なデータタイプや数字、文字列などのデータ分析処理がある場合は、豊富な機能を備えたパンダを使用することをおすすめします。

In [32]: data = [{'name': 'Mary', 'age': 25, 'salary': 1000}, 
    ...: {'name': 'John', 'age': 25, 'salary': 2000}, 
    ...: {'name': 'George', 'age': 30, 'salary': 2500}, 
    ...: {'name': 'John', 'age': 25, 'salary': 2000}, 
    ...: {'name': 'John', 'age': 25, 'salary': 2000}] 
    ...: 
    ...: df = pd.DataFrame(data) 
    ...: df['counts'] = 1 
    ...: df = df.groupby(df.columns.tolist()[:-1]).sum().reset_index(drop=False) 
    ...: 

In [33]: df 
Out[33]: 
    age name salary counts 
0 25 John 2000  3 
1 25 Mary 1000  1 
2 30 George 2500  1 

In [34]: df.to_dict(orient='records') 
Out[34]: 
[{'age': 25, 'counts': 3, 'name': 'John', 'salary': 2000}, 
{'age': 25, 'counts': 1, 'name': 'Mary', 'salary': 1000}, 
{'age': 30, 'counts': 1, 'name': 'George', 'salary': 2500}] 

論理的である:ここにあなたのケースのためのサンプルコードです

(1)まず、あなたのデータからのデータフレームを構築するには、

(2)GROUPBY機能は、それぞれの集約関数を行うことができますグループ。バック辞書に出力する

(3)、あなたはpd.to_dict

パンダを呼び出すことができ、それを学ぶのに時間がかかりますが、それはパンダを知ってworths大きなパッケージです。それは非常に強力で、データ分析を非常に迅速かつエレガントにすることができます。

ありがとうございました。

0

あなたはこれを試すことができます。

import collections 

d = [{'name': 'Mary', 'age': 25, 'salary': 1000}, 
{'name': 'John', 'age': 25, 'salary': 2000}, 
{'name': 'George', 'age': 30, 'salary': 2500}, 
{'name': 'John', 'age': 25, 'salary': 2000}, 
{'name': 'John', 'age': 25, 'salary': 2000}] 

count = dict(collections.Counter([i["name"] for i in d])) 
a = list(set(map(tuple, [i.items() for i in d]))) 
final_dict = [dict(list(i)+[("count", count[dict(i)["name"]])]) for i in a] 

出力:

[{'salary': 2000, 'count': 3, 'age': 25, 'name': 'John'}, {'salary': 2500, 'count': 1, 'age': 30, 'name': 'George'}, {'salary': 1000, 'count': 1, 'age': 25, 'name': 'Mary'}] 
関連する問題