对嵌套列表中的数据进行计数

2024-04-28 11:37:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个嵌套列表。在列表中,它有日期和名称。我要日期上的用户数。例如,在“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]]

Tags: 用户名称列表samram名单queenking
3条回答

您可以使用下面给出的代码,它在jsonb中遍历数组并计数键

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

你可以使用来自collectionsdefaultdict,比如

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

相关问题 更多 >