如果我在C语言中做这个操作,我会创建指向所需起始点的指针并依次移动指针。如果Python中有类似的操作,我不知道它在哪里,也找不到相关信息。我发现的所有技术似乎都会将某些/全部信息复制到新列表中,这在我的应用程序中将耗费大量时间和内存。此外,尽管现在默认情况下字典是有序的,但似乎不能对字典进行切片。
考虑这个人造例子字典——拉丁字母表,其奇怪键入的条目按元音和辅音分组,并按每个组内的条目按字母顺序排序:
dd = { # key: ( phonetic, letter, ascii, ebcedic, baudot, morse, hollerith, strokes, kind )
4296433290: ( 'Alfa', 'A', 65, 193, 3, '.-', (12,1), 3, 'vowl' ),
5046716526: ( 'Echo', 'E', 69, 197, 1, '.', (12,5), 4, 'vowl' ),
5000200584: ( 'India', 'I', 73, 201, 6, '..', (12,9), 3, 'vowl' ),
5000971262: ( 'Oscar', 'O', 79, 214, 24, '---', (11,6), 1, 'vowl' ),
5000921625: ( 'Uniform', 'U', 85, 228, 7, '..-', (0,4), 1, 'vowl' ),
4297147083: ( 'Yankee', 'Y', 89, 232, 21, '-.--', (0,8), 3, 'vowl' ),
4297256046: ( 'Bravo', 'B', 66, 194, 25, '-...', (12,2), 3, 'cons' ),
4298140290: ( 'Charlie', 'C', 67, 195, 14, '-.-.', (12,3), 1, 'cons' ),
5036185622: ( 'Delta', 'D', 68, 196, 9, '-..', (12,4), 2, 'cons' ),
5036854221: ( 'Foxtrot', 'F', 70, 198, 13, '..-.', (12,6), 3, 'cons' ),
5037458768: ( 'Golf', 'G', 71, 199, 26, '--.', (12,7), 2, 'cons' ),
5035556903: ( 'Hotel', 'H', 72, 200, 20, '....', (12,8), 3, 'cons' ),
5037119814: ( 'Juliett', 'J', 74, 209, 11, '.---', (11,1), 2, 'cons' ),
5035556831: ( 'Kilo', 'K', 75, 210, 15, '-.-', (11,2), 3, 'cons' ),
4296755665: ( 'Lima', 'L', 76, 211, 18, '.-..', (11,3), 2, 'cons' ),
5035557110: ( 'Mike', 'M', 77, 212, 28, '--', (11,4), 4, 'cons' ),
5037118125: ( 'November', 'N', 78, 213, 12, '-.', (11,5), 3, 'cons' ),
5000423356: ( 'Papa', 'P', 80, 215, 22, '.--.', (11,7), 2, 'cons' ),
5000923300: ( 'Quebec', 'Q', 81, 216, 23, '--.-', (11,8), 2, 'cons' ),
5000969482: ( 'Romeo', 'R', 82, 217, 10, '.-.', (11,9), 3, 'cons' ),
5035943840: ( 'Sierra', 'S', 83, 226, 5, '...', (0,2), 1, 'cons' ),
5045251209: ( 'Tango', 'T', 84, 227, 16, '-', (0,3), 2, 'cons' ),
5000168680: ( 'Victor', 'V', 86, 229, 30, '...-', (0,5), 2, 'cons' ),
4296684445: ( 'Whiskey', 'W', 87, 230, 19, '.--', (0,6), 4, 'cons' ),
5000923277: ( 'Xray', 'X', 88, 231, 29, '-..-', (0,7), 2, 'cons' ),
4296215569: ( 'Zulu', 'Z', 90, 233, 17, '--..', (0,9), 3, 'cons' ),
}
假设我的目标是在辅音上执行一些处理。由于这个处理需要很多时间(想象几天的时间),因此我想分块进行。在这种情况下,假设每次处理4个辅音。我提前知道开始组的键,例如:
vowlbeg = 4296433290 # key of first vowel
consbeg = 4297256046 # key of first consonant
但我不知道如何利用这个预先知道的信息。例如,要处理第8到11个辅音,我所能做的最好的是:
beg = 8 # begin processing with 8th consonant
end = 12 # end processing with 11th consonant
kind = 'cons' # desired group
i=-1
for d in dd.items():
if d[1][-1] is not kind: continue
i += 1
if i < beg: continue
if i >= end: break
print('processing:', i, d)
这样做可以得到想要的结果,但因为我需要从字典一开始就遍历整个字典,直到找到所需的条目,所以速度会有些慢。
processing: 8 (5035556831, ('Kilo', 'K', 75, 210, 15, '-.-', (11, 2), 3, 'cons'))
processing: 9 (4296755665, ('Lima', 'L', 76, 211, 18, '.-..', (11, 3), 2, 'cons'))
processing: 10 (5035557110, ('Mike', 'M', 77, 212, 28, '--', (11, 4), 4, 'cons'))
processing: 11 (5037118125, ('November', 'N', 78, 213, 12, '-.', (11, 5), 3, 'cons'))
我认为可以使用列表或者字典推导式更简洁地表达这个循环,但是似乎会在内存中创建大量重复的数据。也许上面的方法也是如此,我不确定。
关于我的有序字典,我知道以下几点:
- 组,例如元音和辅音,确实被分组而不是散布。
- 在每个组内,条目按已知的期望顺序排序。
- 每个组的开始键
Q:有更好的方法吗?我的备选方案是坚持并保留一组重复的元组,每组一个,以便能够对其进行切片。但是,就我所知,这将使我的内存翻倍。
注意:从这个简单的例子中不能看出来,但是能够在单个字典中通过键访问条目是我的应用程序的巨大优势。