python 3:拆分信息和报告事件

时间:2011-11-02 20:49:17

标签: python

比如说,我想计算bob访问西尔斯和沃尔玛多少次,我将如何通过创建字典来做到这一点?

information given:
bob:oct1:sears
bob:oct1:walmart
mary:oct2:walmart
don:oct2:sears
bob:oct4:walmart
mary:oct4:sears

2 个答案:

答案 0 :(得分:1)

好的,因为这可能是家庭作业,我会尝试给你一些如何做到这一点的提示。如果这不是作业,请说出来,我将恢复原来的答案和示例代码。

首先,您的数据集的方式是每个条目都是单行的。由于我们希望自己处理每个数据条目,因此我们必须将原始数据拆分为每一行。我们可以使用str.split

每个条目都以简单格式name:date:location构建。因此,要再次获取每个细分,我们可以再次使用str.split。然后我们最终为每个条目分开内容。

要存储此内容,我们首先要按名称对数据进行排序。因此,我们选择以名称为键的字典,并将访问作为数据。由于我们不关心日期,我们可以忘记它。相反,我们想要计算给定名称的单个位置的出现频率。所以我们做的是保留另一个字典,使用位置作为密钥,访问计数作为数据。所以我们最终得到一个双字典,看起来像这样:

{
    'bob': {
        'sears': 1,
        'walmart': 1,
    },
    'mary': {
        ...
    }
}

因此,为了获得最终答案,我们只需查看该字典并立即读出值。

答案 1 :(得分:0)

@poke provided一个很好的解释,这是一个相应的代码:

从命令行或stdin上提供的文件中读取输入并以json格式转储事件:

#!/usr/bin/env python
import csv
import fileinput
import json
import sys
from collections import defaultdict

visits = defaultdict(lambda: defaultdict(int))
for name, _, shop in csv.reader(fileinput.input(), delimiter=':'): 
    visits[name][shop] += 1

# pretty print
json.dump(visits, sys.stdout, indent=2)

输出

{
  "bob": {
    "sears": 1, 
    "walmart": 2
  }, 
  "don": {
    "sears": 1
  }, 
  "mary": {
    "sears": 1, 
    "walmart": 1
  }
}

此表示可以轻松找出访问次数和人员的位置。

如果您始终知道姓名和位置,那么您可以使用更简单的表示形式:

visits = defaultdict(int)
for name, _, shop in csv.reader(fileinput.input(), delimiter=':'):
    visits[name,shop] += 1

print(visits['bob','walmart'])
# -> 2