Python-将事务数据加载到列表中,计算每个字符串的出现次数



由于python中有一项家庭作业,我正在重新使用它,并寻求加快代码部分速度的帮助。我上一篇帖子因为没有提供我的想法而被否决,所以这次我会做得更好。

我有一个采购交易的文本文件,看起来像这样:

A B C D E F
A E F G H I J K 
A B D E F G H
B C D F G H
G H I K J
G H I J
B C D H J K
B C D H K
A C E G I K
A B D F G H I
A B C D E F G H I J K
A B C D E
C D F G
C E F G H I
C D E J K
J K
G H I J K
A B D
A C D K
A B D I J K
A B C E F G 
F G I J K
A F G K 
B C E F G H
A D E
A B 
C D E F 
C E F G H I J
I J K
E F H I J K

其中,每个字母对应于对特定产品的购买,每一行都是一笔交易(对于第一行,有人购买了产品a、B、C、D、E和F)。我需要初步统计每个产品的购买次数,然后创建一个至少购买了S次的物品列表。这就是我的代码:

import itertools
import operator
item_data_lol = []
with open("test_file.txt") as inputfile:
for line in inputfile:
item_data_lol.append(line.strip().split(','))
# this is what item_data_lol loads in as
# [['A B C D E F'], ['A E F G H I J K'], ['A B D E F G H'], ['B C D F G H'], ['G H I K J'], ['G H I J'], ['B C D H J K'], ['B C D H K'], ['A C E G I K'], ['A B D F G H I'], ['A B C D E F G H I J K'], ['A B C D E'], ['C D F G'], ['C E F G H I'], ['C D E J K'], ['J K'], ['G H I J K'], ['A B D'], ['A C D K'], ['A B D I J K'], ['A B C E F G'], ['F G I J K'], ['A F G K'], ['B C E F G H'], ['A D E'], ['A B'], ['C D E F'], ['C E F G H I J'], ['I J K'], ['E F H I J K']]
S = 14
# initialize dictionary to count frequency of individual items
first_lookup = {}
# loop over each row, then each element, obtaining a total element count for each element 
for line in item_data_lol:
line = line[0]
for item in line.split():
if item in first_lookup.keys():
first_lookup[item] += 1
else:
first_lookup[item] = 1

# Get list of frequent items
frequent_items = []
for this_key, this_value in first_lookup.iteritems():
if this_value > support_threshold:
frequent_items.append(this_key)
print(first_lookup)
print(frequent_items)

这种代码结构适用于我的小数据集,但当我在提供的完整txt文件上运行程序时,这需要惊人的时间。这段代码只是我必须编写的一个更大算法(用于查找频繁项集的apriori算法)的一小部分,因此令人担忧的是,第一部分的时间和它一样长。如果我能使用不同的python函数加快这部分代码的速度(我主要用于循环和If case,因为我对python很熟悉,不记得很多函数),那么我可能也能加快程序的后面部分。

感谢任何关于如何加快的想法

您在字典键上而不是在字典本身中遇到了令人遗憾的经典测试。

if item in first_lookup.keys():

应该是

if item in first_lookup:

从字典查找中受益。对first_lookup.keys()的显式调用在Python 2中生成list,因此in应用于列表而不是字典。

在您的情况下,替换该循环:

for line in item_data_lol:
line = line[0]
for item in line.split():
if item in first_lookup.keys():
first_lookup[item] += 1
else:
first_lookup[item] = 1

这样可以进一步加快速度(使用生成器理解初始化的collections.Counter):

import collections
first_lookup = collections.Counter(item for line in item_data_lol for item in line[0].split())

最新更新