1
votes

Compter les données dans la liste imbriquée python

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']]


6 commentaires

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 ()))


3 Réponses :


2
votes

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)]]


0 commentaires

4
votes

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]))


1 commentaires

La sortie semble être erronée par rapport à ce que l ' utilisateur voulait comme sortie: /



1
votes
[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]]

2 commentaires

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]))]