我正在按规定日期计算用户数。我有一个嵌套的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}
请尝试以下代码:
希望这有帮助!你知道吗
@Saharsh提供的解决方案已经以一种简单的方式给出了答案。但我建议对每个实例使用更合适的类型。你知道吗
时间应该存储在
datetime.date
中,如果dict的顺序很重要,那么您应该使用collections.OrderedDict
(它不会对键进行排序,它会保持键的顺序与您在dict中输入键的顺序相同),如果您想保留已知用户的列表,那么应该使用set
。你知道吗日期
首先让我们检查如何将日期字符串转换为日期对象
datetime
模块内的datetime
类的strptime
方法(是的,模块和类具有相同的名称)将为您提供一个datetime
对象,其中包含日期和时间信息。因为我们只关心日期,所以可以使用date
方法将日期提取为date
类的实例。这个datetime
和date
对象可以用作dict
的键分类词典
现在让我们看看
OrderedDict
是如何工作的:这个dict并不像其他dict打印得那么漂亮,但它的工作原理和普通dict完全一样,只是它保证插入顺序是正确的。虽然这看起来很琐碎,但正常的dict不能保证会发生这种情况,您在迭代时可能会在
5=>3
之前得到1=>0
对。在我们的案例中,这很重要,因为每个日期都必须按时间顺序处理。你知道吗套
集合类似于列表,但它们不能包含重复项,并且它们为常见的集合操作(如并集或差集)提供了一些额外的方法。你知道吗
一个集合就像使用大括号(
{}
)而不是方括号([]
)一样简单。你知道吗完整解决方案
visitors
OrderedDict
等价于你的b
dict
,而known_visitors
set
等价于你的c
list
。如您所见,我还从visitors
中删除了1
,将内部的dict
变成了set
,但是如果它们提供了任何信息,您可以通过将循环中的第一行更改为new_visitors = set(visited).difference(known_visitors)
来保留它们。你知道吗循环说明: 我们要做的是首先得到每天访问的
visited
set
和之前已经访问过的known_visitors
的差值。基本上这意味着从每一天中减去已知的。然后我们更新已经知道的,以便未来几天将考虑这些。最后我们通过计算visited
set
的长度来更新相应日期的计数。你知道吗一旦有未知用户到达,只需将新用户添加到已知用户的数组中。我用了联合行动。你知道吗
这将提供:
编辑:排序日期事件。你知道吗
相关问题 更多 >
编程相关推荐