Python 列表切片索引
考虑以下主要列表:Python 列表切片索引,python,list,indexing,lookup,slice,Python,List,Indexing,Lookup,Slice,考虑以下主要列表: main_list = [['room A0', 'level0'], ['room A1', ''], ['room John Doe', ''], ['room 10', 'levelz'], ['room 102', ''], ['Big hall', 'level1a'], ['xyz', '
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)
主列表通常被多次读取,并且只是偶尔修改
现在这是我的解决方案:
par_table = ['level0', 'level1', 'level1a']
ref_par_table = [0,0,0,1,1,2,2]
ref\u par\u table
列表的长度与原始主列表的长度完全相同
par_table
仅包含从原始列表中选取的关键字
当我修改main_列表
时,我也会更新par_表
和ref_par_表
原来的例子是这样的:
question: 'Give me index 4',
answer: main_list[4], par_table[ref_par_table[4]]
('room 102', 'levelz')
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')
还有更优雅的方法吗?
编辑:我的问题更多的是关于数据结构,然后是主列表的实际解析。
在现实生活中,主列表通常在1000-99000个元素之间,其中每个元素的长度为7。因此,在这种情况下,解析(搜索)每个查找的main_列表
是一个大否定。您可以解析main_列表
以获得正确的级别号,如下所示:
question: 'Give me index 4',
answer: main_list[4], par_table[ref_par_table[4]]
('room 102', 'levelz')
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')
您只需按所需数量单步浏览列表项,即可找到具有指定级别的最后一个房间。因此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'), ...]
奇怪的数据结构main\u list
有什么特殊原因吗?有。上面的示例是一个简化的数据结构。最初的列表也是列表列表,反映了一个固定宽度的表,其中列的数量是7,行(行)的数量通常是1000-99000。它是gui程序的一部分,每次击键操作必须严格控制在10ms以下(最坏情况:20ms)。所以我在一台普通的笔记本电脑上实时处理一张很大的桌子。你需要查找。你不使用字典有什么特别的原因吗?msvalkon:你刚才回答了,而我正在编辑我以前的答案。列表列表基本上反映了一个固定宽度的表。msvalkon:也许对于查找,字典是正确的数据结构。想进一步发展你的想法吗?很有可能在之前的4-500行之前你都不会成功。因此,在main_列表中搜索每个查找并不是一个好办法。不过,非常感谢您的代码片段,我将它保存为其他用例(用于真正的搜索,而不是查找)。另外,它是一个固定宽度的表,我不认为将每一行转换为一个类是最有效的方法。