J'ai une liste qui ressemble à ceci.

data = [
      {'time': 10, 'data': 'abcd'}
      {'time': 10, 'data': 'abcd'}
      {'time': 11, 'data': 'bcd'}
      {'time': 12, 'data': 'dc'}
      {'time': 13, 'data': 'ak'}
      {'time': 11, 'data': 'bcd'}

J'ai besoin de compter l'objet de données qui est le même et de garder le nombre de données. J'attends une sortie comme celle-ci.

Expected Output:

data = [
      {'time': 10, 'data': 'abcd','count' : 2}
      {'time': 11, 'data': 'bcd','count' : 2}
      {'time': 12, 'data': 'dc','count' : 1}
      {'time': 13, 'data': 'ak','count' : 1}

C'est possible ? J'essaye de faire ça en python.

-1
Zodiac 19 mai 2020 à 15:50

3 réponses

Meilleure réponse

Bien que la façon dont je l'ai fait ne soit pas très efficace, c'est faisable en parcourant les dictionnaires et en vérifiant si les valeurs des clés time et data sont les mêmes pour le comptage:

data = [
    {'time': 10, 'data': 'abcd'},
    {'time': 10, 'data': 'abcd'},
    {'time': 11, 'data': 'bcd'},
    {'time': 12, 'data': 'dc'},
    {'time': 13, 'data': 'ak'},
    {'time': 11, 'data': 'bcd'}
]

data_counted = []
for d in data:
    for d_c in data_counted:
        if d['time'] == d_c['time'] and d['data'] == d_c['data']:
            d_c['count'] += 1
            break
    else:
        d_new = d.copy()
        d_new['count'] = 1
        data_counted.append(d_new)

print(data_counted)
[{'time': 10, 'data': 'abcd', 'count': 2}, 
 {'time': 11, 'data': 'bcd', 'count': 2}, 
 {'time': 12, 'data': 'dc', 'count': 1}, 
 {'time': 13, 'data': 'ak', 'count': 1}]
1
ywbaek 19 mai 2020 à 13:12

Vous pouvez utiliser itertools.groupby pour regrouper les dictionnaires ayant la même valeur data:

from itertools import groupby

def keyFunc(d):
    return d['data']

def merge(*dicts):
    return {**dicts[0], 'count': len(dicts)}

merged = [merge(*g) for i, g in groupby(sorted(data, key=keyFunc), key=keyFunc)]
print(merged)

Ce dict merged résultant sera:

[
 {'count': 2, 'data': 'abcd', 'time': 10},
 {'count': 1, 'data': 'ak', 'time': 13},
 {'count': 2, 'data': 'bcd', 'time': 11},
 {'count': 1, 'data': 'dc', 'time': 12}
]
1
Shubham Sharma 19 mai 2020 à 13:26

Je ne sais pas à quel point c'est efficace, mais cela devrait faire le travail.

data = [
      {'time': 10, 'data': 'abcd'},
      {'time': 10, 'data': 'abcd'},
      {'time': 11, 'data': 'bcd'},
      {'time': 12, 'data': 'dc'},
      {'time': 13, 'data': 'ak'},
      {'time': 11, 'data': 'bcd'},
]

temp = {}

for i in data:
    s = "{}-{}".format(i['time'], i['data'])
    i['count'] = 1

    if (s not in temp.keys()):
        temp[s] = i
    else:
        temp[s]['count'] += 1

data = [temp[i] for i in temp.keys()]

print(data)

[{'count': 2, 'data': 'abcd', 'time': 10}, 
{'count': 2, 'data': 'bcd', 'time': 11}, 
{'count': 1, 'data': 'dc', 'time': 12}, 
{'count': 1, 'data': 'ak', 'time': 13}] 
1
af3rr 19 mai 2020 à 13:27