记忆节省的替代方案:计数器元组键分割

2024-09-30 05:21:00 发布

您现在位置:Python中文网/ 问答频道 /正文

输入是一个字符串元组列表,我需要一个

  • 每个字符串元组出现多少次
  • 字符串元组的一个元素出现多少次
  • 字符串元组的其他元素出现多少次

我目前正在这样做:

>>> from collections import Counter
>>> data = [('foo','bar'), ('foo', 'bar'), ('foo', 'doo'), ('joo', 'doo'), ('koo', 'lar')]
>>> datacount = Counter(data)
>>> datacount
Counter({('foo', 'bar'): 2, ('joo', 'doo'): 1, ('koo', 'lar'): 1, ('foo', 'doo'): 1})
>>> x, y = zip(*datacount.keys())
>>> x
('joo', 'foo', 'koo', 'foo')
>>> y
('doo', 'bar', 'lar', 'doo')
>>> xcount = Counter(x)
>>> ycount = Counter(y)
>>> xcount
Counter({'foo': 2, 'koo': 1, 'joo': 1})
>>> ycount
Counter({'doo': 2, 'bar': 1, 'lar': 1})

但我知道它占用了三个独立的柜台。除了获取计数和其他数据结构之外,是否有其他方法可以轻松获取计数?


Tags: 字符串元素datafoocounterbar计数元组
1条回答
网友
1楼 · 发布于 2024-09-30 05:21:00

如果要保留X、Y和X*Y的预计算计数,那么没有办法为每个可能的X、Y和X*Y保留一个值,并且当前的解决方案与其他解决方案一样好。你知道吗

如果您使用的是3个独立的Counter对象,那么您可以将所有计数保存在一个Counter中,尽管这样不会减少内存使用。你知道吗

如果不需要预先计算所有内容并将其加载到内存中,则可以:

  • 保留“指针”而不是对象-如果实际字符串非常大,并且希望避免将它们加载到内存中,则可以为每个字符串分配一个id,保留id计数,并仅在必要时映射回字符串。你知道吗
  • 延迟加载/计数-您可以维护每个字符串到它在磁盘上出现的元组的映射,并通过只加载相关元组来计算所需的计数,即:

是的。你知道吗

def count(x,y):
    X = load_tuples(x)
    Y = load_tuples(y)
    XY = [t for t in X if t[1] == y]
    return map(len,[X,Y,XY])

相关问题 更多 >

    热门问题