将特征频率附加到现有列表

时间:2014-06-05 20:04:05

标签: python list loops nltk

我正在寻找一种相当有效的方法,可以在列表中的每个项目的列表中附加要素的频率。

例如,给定此列表:

[['syme', 4, 2], ['said', 4, 2], ['the', 3, 5]]

我想附加列表中第二个项目出现的频率。在上面的列表中,这看起来像这样:

[['syme', 4, 2, 2], ['said', 4, 2, 2], ['the', 3, 5, 1]]

第三个数字代表后两个数字作为列表中的第二个项目出现的频率。 (例如,[4,2]出现两次作为后两个数字,[3,5]出现一次,所以前两个列表将在末尾附加2,第三个列表将附加1。)

实际列表可能有几十万个项目,所以这里的效率和可读代码都是值得的,我想保持列表的当前顺序。

提前致谢!

3 个答案:

答案 0 :(得分:0)

您可以使用collections.Counter类:

from collections import Counter

my_list = [['syme', 4, 2], ['said', 4, 2], ['the', 3, 5]]
counts = Counter([(x[1],x[2],) for x in my_list])

for sub_list in my_list:
    sub_list.append(counts[(sub_list[1], sub_list[2])])

答案 1 :(得分:0)

最有效的方法可能是使用collections.Counter来获取基于对的计数

counts = Counter(tuple(item[1:]) for item in lst)

然后相应地更新列表:

for item in lst:
    item.append(counts[tuple(item[1:])])

如果这两个项目的顺序无关紧要,请在创建item[1:]并更新sorted(...)时将countslst一起打包。

答案 2 :(得分:0)

如果订单无关紧要:

import collections
collections.Counter(frozenset((i[1], i[2]))


a_list = [['syme', 4, 2], ['said', 4, 2], ['the', 3, 5]]

counts = Counter(frozenset(l[1], l[2]) for x in a_list)

for l in a_list:
    l.append(counts[frozenset(l[1], l[2])])