如果您不需要列表本身,则可以完全使用生成器的解决方案,就像@Lattyware所提出的那样。
但是,如果这不是一个选项,那么也许您可以通过仅存储文件中每个字符的位置来压缩列表中的数据,而不会丢失信息。
import random
import string
def track_char(s):
s = s.lower()
d = dict((k, []) for k in set(s))
for position, char in enumerate(s):
d[char].append(position)
return d
st = ''.join(random.choice(string.ascii_uppercase) for _ in range(50000))
d = track_char(st)
len(d["a"])
for char, vals in d.items():
if 2 in vals:
print("Character %s has %s occurrences" % (char,len(d[char]))
Character C has 1878 occurrences
for char, vals in d.items():
if 2 in vals:
print("Character %s has %s occurrences so far" % (char, len([x for x in d[char] if x <= 2))
Character C has 1 occurrences so far
这种方法可以避免在每次出现时重复复制字符字符串,而且可以保留所有出现的信息。
为了比较原始列表和这种方法的对象大小,这里进行了一个测试。
import random
import string
from sys import getsizeof
st = ''.join(random.choice(string.ascii_uppercase) for _ in range(50000))
def original_track(s):
l = []
for position, char in enumerate(s):
l.append([char, position])
return l
original_list = original_track(st)
dict_format = track_char(st)
getsizeof(original_list)
406496
getsizeof(dict_format)
1632
正如您所看到的,dict_format 大约比原字符串小 250 倍。然而,在更大的字符串中,这种大小差异应该更为明显。
[a,2],[b,2],[c,1] ...
是否足够? - ODiogoSilva(索引,迄今出现次数)
元组列表的字典,但我不确定它会节省多少空间(甚至是否会节省任何空间)。 - bruno desthuilliers