有没有可以用来解决这个问题的数据结构?

时间:2019-05-20 22:24:44

标签: python

给出一个日志文件,其中包含以下数据:

USER FROM_PAGE TO_PAGE
A url1 url2
A url1 url3
B url1 url3
A url2 url3
...
...
url can be string like www.google.com/activity/xyz

返回任何用户从一页移动到另一页的可能性

我想使用字典,但无法提出解决方案

预期输出应为:

user A:
url1 ---> url2: 50%
url1 ---> url3: 50%
url2 ---> url3 : 100%

user B:
url1 ---> url2 : 100%

2 个答案:

答案 0 :(得分:2)

您可以使用collections模块使它变得非常干净。该解决方案使用defaultdict在看到新用户时自动创建一个新的Counter,然后为每个重定向向该Counter添加一个。

在“从文件读取”循环的末尾,我们将得到一个数据结构,类似于:{user : {(url1, url2): count}}。该组织使一切都非常容易在第二个循环中打印。

from collections import Counter, defaultdict

users_to_stats = defaultdict(Counter)

with open('tmp.txt') as fp:
    for line in fp:
        user, url1, url2 = line.split()

        users_to_stats[user][(url1, url2)] += 1

for user, counts in users_to_stats.items():
    print(user)

    total_redirects_per_user = sum(counts.values())
    for ((url1, url2), count) in counts.items():
        print(f'{url1} -> {url2} : {count / total_redirects_per_user}')

打印:

A
url1 -> url2 : 0.5
url1 -> url3 : 0.25
url2 -> url3 : 0.25
B
url1 -> url3 : 1.0

答案 1 :(得分:1)

您可以使用元组作为字典的键

例如

possibility = {}
possibility[(A, url1, url2)] = 0.5
possibility[(B, url1, url2)] = 1