我正在寻找一种相当有效的方法,可以在列表中的每个项目的列表中附加要素的频率。
例如,给定此列表:
[['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。)
实际列表可能有几十万个项目,所以这里的效率和可读代码都是值得的,我想保持列表的当前顺序。
提前致谢!
答案 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(...)
时将counts
与lst
一起打包。
答案 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])])