考虑这个主要清单:
main_list = [['room A0', 'level0'],
['room A1', ''],
['room John Doe', ''],
['room 10', 'levelz'],
['room 102', ''],
['Big hall', 'level1a'],
['xyz', '']]
这是一个有序列表:
- level0: 0,1,2
- levelz: 3,4
- level1a: 5,6
我想创建第二个列表(或其他数据结构), 这有助于我快速查找。
示例:
question: 'Give me index 4',
answer: 'room 102', 'levelz' (hidden lookup for levelz, which is at index3)
main_list列表通常会多次读取,并且只是偶尔修改。
现在这是我的解决方案:
par_table = ['level0', 'level1', 'level1a']
ref_par_table = [0,0,0,1,1,2,2]
ref_par_table
列表与原始main_list
的长度完全相同。
par_table
仅包含从原始列表中挑选的关键字。
当我修改main_list
时,我也会更新par_table
和ref_par_table
。
所以最初的例子看起来像这样:
question: 'Give me index 4',
answer: main_list[4], par_table[ref_par_table[4]]
('room 102', 'levelz')
还有更优雅的方法吗?
编辑:我的问题更多的是关于数据结构,然后是main_list的实际解析。
在现实生活中,主列表通常在1000-99000个元素之间,其中每个元素是7个长度的列表。因此,在这种情况下,为每个查找解析(搜索)main_list
是 big no 。
答案 0 :(得分:0)
您可以像这样解析main_list
正确的级别编号:
def getRoomTuple(list, index):
name = list[index][0]
level = list[index][1]
i = 0
while level is "":
level = list[index-i][1]
i += 1
return name, level
print getRoomTuple(main_list, 2) # ('room John Doe', 'level0')
您只需要切换尽可能多的列表项,以查找具有指定level
的最后一个房间。所以getRoomTuple(0)
将立即返回; getRoomTuple(2)
必须检查索引2,1和0。
如果可能,您还应该使用更多的语义数据结构。
class Room(object):
name = None
level = None
def __init__(self, name, level):
self.name = name
self.level = level
main_list = [Room('A0', 'level0'), Room('A1', 'level1'), ...]