Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表切片索引_Python_List_Indexing_Lookup_Slice - Fatal编程技术网

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_列表中搜索每个查找并不是一个好办法。不过,非常感谢您的代码片段,我将它保存为其他用例(用于真正的搜索,而不是查找)。另外,它是一个固定宽度的表,我不认为将每一行转换为一个类是最有效的方法。