Подсчитать данные во вложенном списке python - PullRequest
1 голос
/ 10 октября 2019

У меня есть вложенный список. В списке есть дата и имя. Я хочу посчитать пользователей на дату. Например, в '2019-10-11' есть 5 пользователей. Но сам пользователь sam уже существует, поэтому я считаю его 4. Вот список

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

Требуется вывод:

a = [['2019-10-10','2019-10-11','2019-10-12','2019-10-14'],[2,4,1,1]]

Ответы [ 3 ]

4 голосов
/ 10 октября 2019

Вы можете использовать приведенный ниже код, он перебирает массив и подсчитывает ключи в формате json b

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

b = {}

for iter in a:
  if iter[1] in b:
    if(iter[0] not in b[iter[1]]):
      b[iter[1]][iter[0]] = 1
  else:
    b[iter[1]] = {iter[0]: 1}

    print(b)

результат приведенного выше кода будет:

{'2019-10-11': {'sam': 1, 'king': 1, 'kumar': 1, 'jeba': 1}, '2019-10-12': {'ram': 1}, '2019-10-10': {'queen': 1, 'sam': 1}, '2019-10-14': {'howl': 1}}

Конечновы можете преобразовать его в структуру массива следующим образом

for key in b:
  print(key, len(b[key]))
  res[0].append(key)
  res[1].append(len(b[key]))

результат будет

[['2019-10-11', '2019-10-12', '2019-10-10', '2019-10-14'], [4, 1, 2, 1]]
2 голосов
/ 10 октября 2019

Вы можете использовать defaultdict из collections как,

>>> 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)]]
1 голос
/ 10 октября 2019
from collections import Counter

list(zip(*Counter(list(zip(*set(zip(*zip(*a)))))[1]).items()))

Out[54]: [('2019-10-11', '2019-10-10', '2019-10-12', '2019-10-14'), (4, 2, 1, 1)]

это можно упростить следующим образом:

list(zip(*Counter([j for _, j in set([tuple(i) for i in a])]).items()))

[('2019-10-11', '2019-10-10', '2019-10-12', '2019-10-14'), (4, 2, 1, 1)]

другой способ сделать это без импорта модулей:

b = set(zip(*zip(*a)))
d = {}

for name,date in b:
    d[date] = d.get(date,0)+1
list(zip(*d.items()))

[('2019-10-11', '2019-10-10', '2019-10-12', '2019-10-14'), (4, 2, 1, 1)]

если вам нужен отсортированный список списков, вы можетеделать:

[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]]
...