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

または、ループが 1 つだけ必要な場合:

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

キーをoperator.itemgetter('user')としてitertools.groupbyを使用して要素をグループ化し、次に groupby オブジェクトを反復処理して、グループの長さに基づいてカウントを決定します。

于 2013-03-28T11:08:22.843 に答える