J'ai une liste imbriquée. Dans la liste, il a une date et un nom. Je veux le décompte des utilisateurs à la date. Par exemple, dans '2019-10-11', il y a 5 utilisateurs. Mais l'utilisateur sam existe déjà, donc je le compte comme 4. Voici la liste
a = [['2019-10-10','2019-10-11','2019-10-12','2019-10-14'],[2,4,1,1]]
Sortie requise:
a =[['sam', '2019-10-11'], ['ram', '2019-10-12'], ['king', '2019-10-11'], ['queen', '2019-10-10'], ['ram', '2019-10-12'], ['kumar', '2019-10-11'], ['jeba', '2019-10-11'], ['sam', '2019-10-10'], ['sam', '2019-10-11'], ['howl', '2019-10-14']]
3 Réponses :
Vous pouvez utiliser defaultdict
de collections
comme,
>>> a =[['sam', '2019-10-11'], ['ram', '2019-10-12'], ['king', '2019-10-11'], ... ['queen', '2019-10-10'], ['ram', '2019-10-12'], ['kumar', '2019-10-11'], ... ['jeba', '2019-10-11'], ['sam', '2019-10-10'], ['sam', '2019-10-11'], ... ['howl', '2019-10-14']] >>> >>> from collections import defaultdict >>> d = defaultdict(set) # using `set` to not care about duplicate `name` on same `date`, otherwise use `list` instead of `set` >>> # and use `d[date].append(name)` >>> for name, date in a: ... d[date].add(name) # maybe, two users can be there for the same date ? ... >>> data = [(k,len(v)) for k,v in sorted(d.items())] >>> data [('2019-10-10', 2), ('2019-10-11', 4), ('2019-10-12', 1), ('2019-10-14', 1)] >>> list(zip(*data)) # returns a `list` of `tuple`s which usually should be fine for any iteration [('2019-10-10', '2019-10-11', '2019-10-12', '2019-10-14'), (2, 4, 1, 1)] >>> required = [list(x) for x in zip(*data)] # if you really want `list` of `list`s >>> required [['2019-10-10', '2019-10-11', '2019-10-12', '2019-10-14'], [2, 4, 1, 1)]]
Vous pouvez utiliser le code ci-dessous, il itère sur le tableau et compte les clés dans un json b
[['2019-10-11', '2019-10-12', '2019-10-10', '2019-10-14'], [4, 1, 2, 1]]
le résultat du code ci-dessus sera:
for key in b: print(key, len(b[key])) res[0].append(key) res[1].append(len(b[key]))
La sortie
semble être erronée par rapport à ce que l ' utilisateur
voulait comme sortie: /
[list(i) for i in zip(*sorted(d.items(),key=lambda x:x[0]))] Out[112]: [['2019-10-10', '2019-10-11', '2019-10-12', '2019-10-14'], [2, 4, 1, 1]]
Merci pour la réponse, mais le résultat doit être sous la forme d'une liste de liste [['2019-10-11', '2019-10-10', '2019-10-12', '2019-10 -14 '], [4, 2, 1, 1]]
et il devrait être trié
@crustsalty vous pouvez simplement trier votre dictionnaire ie. [list (i) for i in zip (* sorted (d.items (), key = lambda x: x [0]))]
Qu'avez-vous essayé? avez-vous essayé de parcourir chaque liste, d'enregistrer la date et d'ajouter les noms uniques à chaque date correspondante?
Non. J'ai essayé ce
res1, res2 = map (list, zip (* a))
qui séparait ma liste. De plus, je ne sais pas où aller. Il a plus de nombre de données.Qu'est-il arrivé à
'2019-10-10'
?Le 10/10/2019, vous avez un utilisateur "sam". Pourquoi n'est-il pas dans la sortie?
Oui. il doit être compté comme 2
vous recherchez
depuis les collections importation Counter; list (zip (* Counter (list (zip (* set (zip (* zip (* a))))) [1]) .items ()))