gpt4 book ai didi

python - 从列表中列出最常见的列表

转载 作者:太空宇宙 更新时间:2023-11-03 18:56:04 24 4
gpt4 key购买 nike

我有这个代码

text = open("tags.txt", "r")
mylist = []
metalist = []

for line in text:
mylist.append(line)

if len(mylist) == 5:
metalist.append(mylist)
mylist.pop(0)

这将打开一个文本文件,每行一个 POS 标签。然后它将前 5 个 POS 标签列表添加到 mylist,然后将其添加到 Metalist。然后它向下移动到下一行并创建下一个包含 5 个 POS 标签的序列。该文本文件总共有大约 110k~ 标签。我需要从金属学家那里找到最常见的 POS 标签序列。我尝试使用计数器集合,但列表不可散列。解决这个问题的最佳方法是什么?

最佳答案

正如其中一条评论中提到的,您可以简单地使用标签元组而不是标签列表,这将与 collections 模块中的 Counter 类一起使用。以下是如何使用您问题中的代码的基于列表的方法来执行此操作,并进行一些优化,因为您必须处理大量 POS 标签:

from collections import Counter

GROUP_SIZE = 5
counter = Counter()
mylist = []

with open("tags.txt", "r") as tagfile:
tags = (line.strip() for line in tagfile)
try:
while len(mylist) < GROUP_SIZE-1:
mylist.append(tags.next())
except StopIteration:
pass

for tag in tags: # main loop
mylist.pop(0)
mylist.append(tag)
counter.update((tuple(mylist),))

if len(counter) < 1:
print 'too few tags in file'
else:
for tags, count in counter.most_common(10): # top 10
print '{}, count = {:,d}'.format(list(tags), count)

但是,如果同时使用 deque 会更好。来自 collections 模块而不是 list 来完成您正在做的事情,因为前者非常高效,O(1),从任一端追加和弹出 vs O(n )与后者。它们使用的内存也更少。

除此之外,自 Python v 2.6 起,它们支持 maxlen 参数,该参数消除了在所需大小达到后显式将 pop() 元素移出末尾的需要。已经达到了——所以这是一个基于它们的更有效的版本:

from collections import Counter, deque

GROUP_SIZE = 5
counter = Counter()
mydeque = deque(maxlen=GROUP_SIZE)

with open("tags.txt", "r") as tagfile:
tags = (line.strip() for line in tagfile)
try:
while len(mydeque) < GROUP_SIZE-1:
mydeque.append(tags.next())
except StopIteration:
pass

for tag in tags: # main loop
mydeque.append(tag)
counter.update((tuple(mydeque),))

if len(counter) < 1:
print 'too few tags in file'
else:
for tags, count in counter.most_common(10): # top 10
print '{}, count = {:,d}'.format(list(tags), count)

关于python - 从列表中列出最常见的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17242088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com