如何优化以下字典的构建?

时间:2016-12-17 21:49:18

标签: python python-3.x dictionary

您好我有两个看起来如下的数组:

print("list of clusters",y_pred[:10]
print("list of comments",listComments[:10])

输出:

list of comments ['hello This', 'Fabiola hello', 'I am using',  ...

list of clusters [ 2 11  2  2 11  2  2  2  2  2]

群集列表已经建立,将kmeans应用于"评论列表的每个评论"所以这两个列表的长度相同:

y_pred = kmeans.predict(tfidf)
print("length list comments",len(listComments))
print("length list clusters",len(y_pred))

输出:

length list comments 17223
length list clusters 17223

然后我想对属于特定数字的所有注释进行分组,例如创建一个字典,其中集群的数量为密钥,以及属于该特定集群的所有注释的列表,如下所示:

myDict = {2: ['hello This', 'I am using',...], 11: ['Fabiola hello', ...], ... }

对于此示例,因为群集的第一个标签是2,第一个注释被分配给我的词典,然后由于群集列表中的标签是11,因此以下注释被分配给群集11,那么标签是2评论'我正在使用'被分配到集群2的列表:

我尝试按如下方式实现:

dict_clusters2 = {}
for i in range(0,len(y_pred)):
    #print(kmeans.labels_[i])
    #print(listComments[i])
    if not y_pred[i] in dict_clusters2:
        dict_clusters2[y_pred[i]] = []
    dict_clusters2[y_pred[i]].append(listComments[i])
print("dictionary constructed")

然而这种方法需要花费大量时间来计算,因此我非常感谢您对优化此过程的建议,非常感谢您的关注和支持,

我正在使用的python版本如下:

3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]
3.5.2

1 个答案:

答案 0 :(得分:1)

您正在为两个列表使用大量索引,其复杂性为O(N)和其他一些操作。相反,您可以使用zip函数创建包含数字和注释对的生成器,然后使用collections.defaultdict()来创建您期望的字典(您的情况正是此函数的用途):

from collections import defaultdict
pairs = zip(y_pred, listComments)

dict_clusters2 = defaultdict(list)

for num, comment in pairs:
    dict_clusters2[num].append(comment)