列表切片的索引

时间:2014-03-04 08:48:28

标签: python list indexing lookup slice

考虑这个主要清单:

 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_tableref_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

1 个答案:

答案 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'), ...]