【问题标题】:Index for list slices列表切片的索引
【发布时间】:2014-03-04 08:48:28
【问题描述】:

考虑这个主要列表:

 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 是一个大忌

【问题讨论】:

  • main_list这种奇怪的数据结构有什么特别的原因吗?
  • 是的。上面的例子是一个简化的数据结构。原始的也是列表列表,反映了一个固定宽度的表格,其中列数为 7,行数(行)通常为 1000-99000。它是 gui 程序的一部分,每次击键操作必须严格控制在 10 毫秒以下(最坏情况:20 毫秒)。所以我基本上在一台中等大小的笔记本电脑上实时处理一张相当大的桌子。
  • 您需要查找。您不使用字典的任何特殊原因?
  • msvalkon:您刚刚回复,而我正在编辑我之前的答案。基本上列表列表反映了一个固定宽度表。
  • msvalkon:也许对于 lookup 来说,字典是正确的数据结构。想进一步发展你的想法吗?

标签: python list indexing lookup slice


【解决方案1】:

您可以像这样解析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'), ...]

【讨论】:

  • 在 4-500 行之前你很可能不会受到打击。因此,每次查找都通过main_list 搜索不是要走的路。但是非常感谢您的 sn-ps,我将其保存用于其他用例(用于真正的搜索,而不是查找)。它也是一个固定宽度的表格,我不认为将每一行转换为一个类是最有效的方法。
猜你喜欢
  • 2021-12-02
  • 2021-12-18
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
相关资源
最近更新 更多