0

我有 python 中的日志列表,例如

[{'activity': 'eating', 'time': 800, 'user': 'A'},
 {'activity': 'running', 'time': 900, 'user': 'A'},
 {'activity': 'dancing', 'time': 805, 'user': 'A'},
 {'activity': 'eating', 'time': 1800, 'user': 'A'},
 {'activity': 'eating', 'time': 800, 'user': 'B'},
 {'activity': 'playing', 'time': 1000, 'user': 'B'},
 {'activity': 'playing', 'time': 800, 'user': 'B'}]

现在我需要根据用户找到活动计数,最后返回类似

{'A': {'count': 4,
       'logs': [{'activity': 'eating', 'time': 800, 'user': 'A'},
                {'activity': 'running', 'time': 900, 'user': 'A'},
                {'activity': 'dancing', 'time': 805, 'user': 'A'},
                {'activity': 'eating', 'time': 1800, 'user': 'A'}]},
 'B': {'count': 3,
       'logs': [{'activity': 'eating', 'time': 800, 'user': 'B'},
                {'activity': 'playing', 'time': 1000, 'user': 'B'},
                {'activity': 'playing', 'time': 800, 'user': 'B'}]}}

我尝试遍历所有日志并找到,但这很混乱有人可以建议我更好的解决方案吗?

4

3 回答 3

2
>>> logs = [{'user':'A' , 'activity': 'eating', 'time':'0800'},{'user':'A' , 'activity': 'running', 'time':'0900'}, {'user':'B' , 'activity': 'eating', 'time':'0800'}, {'user':'B' , 'activity': 'playing', 'time':'1000'}, {'user':'A' , 'activity': 'dancing', 'time':'0805'}, {'user':'A' , 'activity': 'eating', 'time':'1800'}, {'user':'B' , 'activity': 'playing', 'time':'0800'}]
>>> user_logs = {}
>>> for log in logs:
        user_log = user_logs.setdefault(log['user'], {})
        user_log['count'] =  user_log.get('count', 0) + 1
        user_log.setdefault('logs', []).append(log)


>>> user_logs
{'A': {'count': 4, 'logs': [{'time': '0800', 'user': 'A', 'activity': 'eating'}, {'time': '0900', 'user': 'A', 'activity': 'running'}, {'time': '0805', 'user': 'A', 'activity': 'dancing'}, {'time': '1800', 'user': 'A', 'activity': 'eating'}]}, 'B': {'count': 3, 'logs': [{'time': '0800', 'user': 'B', 'activity': 'eating'}, {'time': '1000', 'user': 'B', 'activity': 'playing'}, {'time': '0800', 'user': 'B', 'activity': 'playing'}]}}

这可能是一种更好(更简单)的方法:

>>> user_logs = {}
>>> for log in logs:
        user_logs.setdefault(log['user'], []).append(log)


>>> user_logs
{'A': [{'time': '0800', 'user': 'A', 'activity': 'eating'}, {'time': '0900', 'user': 'A', 'activity': 'running'}, {'time': '0805', 'user': 'A', 'activity': 'dancing'}, {'time': '1800', 'user': 'A', 'activity': 'eating'}], 'B': [{'time': '0800', 'user': 'B', 'activity': 'eating'}, {'time': '1000', 'user': 'B', 'activity': 'playing'}, {'time': '0800', 'user': 'B', 'activity': 'playing'}]}

计数不再是键,但您可以像这样获得计数

>>> len(user_logs['A'])
4
于 2013-03-28T11:34:14.443 回答
1

试试这个:

>>> users = {}
>>> for i in logs:
    name = i['user']
    if name not in users:
        users[name] = []
    users[name].append(i)

要获得所需的输出:

... the stuff above ...
>>> for user in users:
    users[user] = {'count': len(users[user]), 'logs':users[user]}

或者,如果您只想要一个循环:

>>> for i in logs:
    name = i['user']
    if name not in users:
        users[name] = {'count':0, 'logs':[]}
    users[name]['count'] += 1
    users[name]['logs'].append(i)
于 2013-03-28T11:59:56.837 回答
0

使用itertools.groupby和 key as operator.itemgetter('user')对元素进行分组,然后遍历 groupby 对象并根据组的长度确定计数

于 2013-03-28T11:08:22.843 回答