次のような辞書のリストがあります。
[{"Audiofile": "test1.mp3", "Time": "2020-09-03 13:47:22.478868", "Author": "Lisa"}, {"Audiofile": "test2.mp3", "Time": "2020-09-03 13:47:32.239118", "Author": "Mike"},
{"Audiofile": "test2.mp3", "Time": "2020-09-03 13:49:15.535216", "Author": "John"}]
この例では、最終的には次のような辞書のリストが必要になります。
[{"test1.mp3": 1}, {"test2.mp3": 2}]
ここには、すべてのオーディオファイルと、このリスト内でそれらが出現した回数がリストされます。
これを達成するには何が最善の方法でしょうか?
------------------------
コレクション.カウンターを使用できます
from collections import Counter
res = Counter(x['Audiofile'] for x in d)
print(dict(res))
出力:
{'test1.mp3': 1, 'test2.mp3': 2}
itertools.groupby の使用
res = [{k: len(list(g))} for k, g in groupby(d, lambda x: x['Audiofile'])]
1
collections.Counter はリストに限定されません。Counter([x['Audiofile']] の代わりに Counter(x['Audiofile'] for x in d) を実行することもできます。 d の x の場合])
– ダウェオ
2020 年 9 月 3 日 12:09
------------------------
辞書のリストを用意する代わりに、辞書を反復処理して、カウンタとして機能する辞書を 1 つ生成することもできます。
from collections import defaultdict
counter = defaultdict(int)
for audio_data in data_dictionaries: #your list of dictionaries
counter[audio_data['Audiofile']] += 1
辞書のリストとして取得する必要がある場合は、次のように単純なリスト内包表記を使用してこのカウンタを変換できます。
list_dictionaries = [{k:v} for k,v in counter.items()]
これであなたが探していることが解決されることを願っていますまたは - これはすべてを線形時間で実行します。
------------------------
from collections import Counter
arr = [{"Audiofile": "test1.mp3", "Time": "2020-09-03 13:47:22.478868", "Author": "Lisa"},
{"Audiofile": "test2.mp3", "Time": "2020-09-03 13:47:32.239118", "Author": "Mike"},
{"Audiofile": "test2.mp3", "Time": "2020-09-03 13:49:15.535216", "Author": "John"}]
cnt = Counter()
for item in arr:
cnt[item['Audiofile']] += 1
print(dict(cnt))