gpt4 book ai didi

python - 在 Python 数据集中搜索单词模式

转载 作者:行者123 更新时间:2023-11-28 23:02:06 26 4
gpt4 key购买 nike

我希望我能够清楚地解释这个问题。我是一个 python 实验者(以防下面的查询显得幼稚)

假设我有以下形式的数据集:

a = ( ('309','308','308'), ('309','308','307'), ('308', '309','306', '304'))

让我给每个人打电话('309','308','308')作为路径。

我想找到以下的计数:

一个。 Count('309','308', <any word>)

Count('309',<any word>,'308')

以及所有可能的排列。

我认为它是某种正则表达式,可以帮助我实现此搜索。而且,我有 50000 条路径。

谁能建议我如何在 python 中执行此类操作?我探索了 trie 和 radix,但我认为这对我没有帮助。

谢谢,萨加尔

最佳答案

你可以使用 collections.Counter这样做:

>>> from collections import Counter
>>> a = ( ('309','308','308'), ('309','308','307'), ('308', '309','306', '304'))
>>> Counter((x, y) for (x, y, *z) in a)
Counter({('309', '308'): 2, ('308', '309'): 1})
>>> Counter((x, z) for (x, y, z, *w) in a)
Counter({('308', '306'): 1, ('309', '308'): 1, ('309', '307'): 1})

我在这里还使用了扩展元组解包,它在 Python 3.x 之前不存在,只有当你有不确定长度的元组时才需要它。在 python 2.x 中,您可以改为:

Counter((item[0], item[1]) for item in a)

但是,我不能说这会有多高效。我不认为它应该是坏的。

Counter 具有类似dict 的语法:

>>> count = Counter((x, y) for (x, y, *z) in a)
>>> count['309', '308']
2

编辑:您提到它们的长度可能大于 1,在这种情况下,您可能会遇到问题,因为如果它们比要求的长度短,它们将无法解压。解决方案是更改生成器表达式以忽略任何不符合要求的格式:

Counter((item[0], item[1]) for item in a if len(item) >= 2)

例如:

>>> a = ( ('309',), ('309','308','308'), ('309','308','307'), ('308', '309','306', '304'))
>>> Counter((x, y) for (x, y, *z) in a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.2/collections.py", line 460, in __init__
self.update(iterable, **kwds)
File "/usr/lib/python3.2/collections.py", line 540, in update
_count_elements(self, iterable)
File "<stdin>", line 1, in <genexpr>
ValueError: need more than 1 value to unpack
>>> Counter((item[0], item[1]) for item in a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.2/collections.py", line 460, in __init__
self.update(iterable, **kwds)
File "/usr/lib/python3.2/collections.py", line 540, in update
_count_elements(self, iterable)
File "<stdin>", line 1, in <genexpr>
IndexError: tuple index out of range
>>> Counter((item[0], item[1]) for item in a if len(item) >= 2)
Counter({('309', '308'): 2, ('308', '309'): 1})

如果需要可变长度计数,最简单的方法是使用列表切片:

start = 0
end = 2
Counter(item[start:end] for item in a if len(item) >= start+end)

当然,这只适用于连续运行,如果你想单独挑选列,你必须做更多的工作:

def pick(seq, indices):
return tuple([seq[i] for i in indices])

columns = [1, 3]
maximum = max(columns)
Counter(pick(item, columns) for item in a if len(item) > maximum)

关于python - 在 Python 数据集中搜索单词模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10243428/

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