如果其他列表中不存在,则按日期统计用户数

2024-04-28 06:46:47 发布

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

我正在按规定日期计算用户数。我有一个嵌套的dict(named as b)list(named as c)。在列表中,我有一些用户。通过比较列表中的用户,我想计算b中date的用户数。如果用户在list (c)中,则不应计算该用户数。我通过计算给定日期的用户数成功了。你知道吗

但是现在,我的问题是,如果用户已经存在于b中的before日期中,就不应该计算它。我不知道如何使它成为可能。帮我解决一些问题。例如,在date 2019-10-12中,date 2019-10-11中已经存在名为prince的用户,list(c)中已经存在名为ram的用户,因此应该将其计为0。但在我的例子中,我得到值1

b = {'2019-10-10': {'sam': 1, 'maha': 1}, '2019-10-11': {'sam': 1, 'prince': 1, 'kumar': 1, 'jeba': 1}, '2019-10-12': {'ram': 1, 'prince': 1}, '2019-10-13': {'raja': 1, 'peer': 1}}


c = ['sam', 'ram', 'king', 'queen', 'kumar', 'jeba', 'howl']
f ={}
for i in b:
    for j in b[i]:
        if j not in c: 
            if i not in f:
                f[i]=1
            else:
                f[i]=f[i]+1
        else:
            if i not in f:
                f[i]=0
print(f)

我的输出:

{'2019-10-10': 1, '2019-10-11': 1, '2019-10-12': 1, '2019-10-13': 2}

要求:

{'2019-10-10': 1, '2019-10-11': 1, '2019-10-12': 0, '2019-10-13': 2}

Tags: 用户in列表dateifsamasnot
3条回答

请尝试以下代码:

b={'2019-10-10': {'sam': 1, 'maha': 1}, '2019-10-11': {'sam': 1, 'prince': 1, 'kumar': 1, 'jeba': 1}, '2019-10-12': {'ram': 1, 'prince': 1}, '2019-10-13': {'raja': 1, 'peer': 1}}
c=['ram', 'maha', 'kumar', 'raja', 'prince', 'queen', 'king', 'peer', 'jeba', 'howl', 'sam']
sorted_keys = list(b.keys())
sorted_keys.sort() # sort keys in ascending order of date
d={k:0 for k in b} # initialise d dict
last_seen=[]  # last seen element 

for k in sorted_keys:
    for k1 in b[k]:
        if k1 not in c and k1 not in last_seen:
            d[k]+=1;last_seen.append(k1)
print(d)

希望这有帮助!你知道吗

@Saharsh提供的解决方案已经以一种简单的方式给出了答案。但我建议对每个实例使用更合适的类型。你知道吗

时间应该存储在datetime.date中,如果dict的顺序很重要,那么您应该使用collections.OrderedDict(它不会对键进行排序,它会保持键的顺序与您在dict中输入键的顺序相同),如果您想保留已知用户的列表,那么应该使用set。你知道吗

日期

首先让我们检查如何将日期字符串转换为日期对象

from datetime import datetime

date = datetime.strptime('2019-10-10', '%Y-%m-%d')
print(type(date), date) # <class 'datetime.datetime'> 2019-10-10 00:00:00
date = date.date()
print(type(date), date) # <class 'datetime.date'> 2019-10-10

datetime模块内的datetime类的strptime方法(是的,模块和类具有相同的名称)将为您提供一个datetime对象,其中包含日期和时间信息。因为我们只关心日期,所以可以使用date方法将日期提取为date类的实例。这个datetimedate对象可以用作dict的键

分类词典

现在让我们看看OrderedDict是如何工作的:

from collections import OrderedDict

d = OrderedDict()
d[3] = 1
d[2] = 2
d[5] = 3
d[1] = 0
print(d) # OrderedDict([(3, 1), (2, 2), (5, 3), (1, 0)]) 

这个dict并不像其他dict打印得那么漂亮,但它的工作原理和普通dict完全一样,只是它保证插入顺序是正确的。虽然这看起来很琐碎,但正常的dict不能保证会发生这种情况,您在迭代时可能会在5=>3之前得到1=>0对。在我们的案例中,这很重要,因为每个日期都必须按时间顺序处理。你知道吗

集合类似于列表,但它们不能包含重复项,并且它们为常见的集合操作(如并集或差集)提供了一些额外的方法。你知道吗

c = {'sam', 'ram', 'king', 'queen', 'kumar', 'jeba', 'howl'}

一个集合就像使用大括号({})而不是方括号([])一样简单。你知道吗

完整解决方案

from collections import OrderedDict
from datetime import datetime

visitors = OrderedDict()
visitors[datetime.strptime('2019-10-10', '%Y-%m-%d').date()] = {'sam', 'maha'}
visitors[datetime.strptime('2019-10-11', '%Y-%m-%d').date()] = {'sam', 'prince', 'kumar', 'jeba'}
visitors[datetime.strptime('2019-10-12', '%Y-%m-%d').date()] = {'ram', 'prince'}
visitors[datetime.strptime('2019-10-13', '%Y-%m-%d').date()] = {'raja', 'peer'}

known_visitors = {'sam', 'ram', 'king', 'queen', 'kumar', 'jeba', 'howl'}

new_visitors_count = OrderedDict()
for date, visited in visitors.items():
    new_visitors = visited.difference(known_visitors)
    known_visitors = known_visitors.union(new_visitors)
    new_visitors_count[date] = len(new_visitors)

print(new_visitors_count)

visitorsOrderedDict等价于你的bdict,而known_visitorsset等价于你的clist。如您所见,我还从visitors中删除了1,将内部的dict变成了set,但是如果它们提供了任何信息,您可以通过将循环中的第一行更改为new_visitors = set(visited).difference(known_visitors)来保留它们。你知道吗

from collections import OrderedDict
from datetime import datetime

visitors = OrderedDict()
visitors[datetime.strptime('2019-10-10', '%Y-%m-%d').date()] = {'sam': 1, 'maha': 1}
visitors[datetime.strptime('2019-10-11', '%Y-%m-%d').date()] = {'sam': 1, 'prince': 1, 'kumar': 1, 'jeba': 1}
visitors[datetime.strptime('2019-10-12', '%Y-%m-%d').date()] = {'ram': 1, 'prince': 1}
visitors[datetime.strptime('2019-10-13', '%Y-%m-%d').date()] = {'raja': 1, 'peer': 1}

known_visitors = {'sam', 'ram', 'king', 'queen', 'kumar', 'jeba', 'howl'}

new_visitors_count = OrderedDict()
for date, visited in visitors.items():
    new_visitors = set(visited).difference(known_visitors)
    known_visitors = known_visitors.union(new_visitors)
    new_visitors_count[date] = len(new_visitors)

print(new_visitors_count)

循环说明: 我们要做的是首先得到每天访问的visitedset和之前已经访问过的known_visitors的差值。基本上这意味着从每一天中减去已知的。然后我们更新已经知道的,以便未来几天将考虑这些。最后我们通过计算visitedset的长度来更新相应日期的计数。你知道吗

一旦有未知用户到达,只需将新用户添加到已知用户的数组中。我用了联合行动。你知道吗

b = {'2019-10-10': {'sam': 1, 'maha': 1}, '2019-10-11': {'sam': 1, 'prince': 1, 'kumar': 1, 'jeba': 1}, '2019-10-12': {'ram': 1, 'prince': 1}, '2019-10-13': {'raja': 1, 'peer': 1}}
c = ['sam', 'ram', 'king', 'queen', 'kumar', 'jeba', 'howl']
visit = {}
k = list(b.keys())
k.sort()

for i in k:
    x = set(b[i].keys()).difference(set(c))
    visit[i]=len(x)
    c = list(set(c).union(x))
print(visit)

这将提供:

{'2019-10-10': 1, '2019-10-11': 1, '2019-10-12': 0, '2019-10-13': 2}

编辑:排序日期事件。你知道吗

相关问题 更多 >