如何在Python中使用随机索引处理多维列表

如何在Python中使用随机索引处理多维列表,python,Python,我正在寻找一种有效的方法,将指向文件的不同指针保存在多维列表中。 我的函数在向其发送作业时立即触发。在每个作业中,我得到三个值,seq\u id,cls\u id和au\u id。 第一个作业初始化指针列表[seq\u id][cls\u id][au\u id],如下所示: files = {} pointers_list = [] pointers_list_flag = False def worker(body): data = body['data'] file

我正在寻找一种有效的方法,将指向文件的不同指针保存在多维列表中。 我的函数在向其发送作业时立即触发。在每个作业中,我得到三个值,
seq\u id
cls\u id
au\u id
。 第一个作业初始化
指针列表[seq\u id][cls\u id][au\u id]
,如下所示:

files = {}
pointers_list = []
pointers_list_flag = False

def worker(body):
    data = body['data']   
    file_id = body['file_id']
    seq_id = body['seq_id']
    cls_id = body['cls']
    au_id = body['au_id']

    if (file_id in files):
        pointers_list_flag = False
        files[file_id].append(body['du']) 
    else: 
        # first job
        files[file_id] = [body['du']]
        # do other stuffs only the first time
        [...]
        #init the pointers_list
        pointers_list.append([])
        pointers_list[seq_id].append([])
        pointers_list[seq_id][cls_id].append([])
        pointers_list[seq_id][cls_id][au_id] = 0
        pointers_list_flag = True
   if not pointers_list_flag:
       #the following jobs update the pointers_list
       current_pointer = getcurrentpointer()
       pointers_list.append([])
       pointers_list[seq_id].append([])
       pointers_list[seq_id][cls_id].append([])
       pointers_list[seq_id][cls_id][au_id] = current_pointer    
假设我的第一份工作有
seq\u id=0
cls\u id=1
au\u id=0
。很明显,当我尝试

    pointers_list[<seq_id=0>][<cls_id=1>].append([])
指针\u列表[]。追加([])
因为我试图访问
指针列表[0][1]
,而我只有init
指针列表[0][0]
。问题是我无法预先知道任何键的长度和值。 有什么提示吗?我要用字典吗

编辑1:

字典
文件
保存已处理的作业。列表
pointers\u list
将带有
seq\u id、cls\u id和au\u id的作业指针(file.tell())保存到输出文件。我之所以需要它,是因为我以随机顺序接收作业,但我需要用作业数据按指定顺序写入输出文件,实际上是由
seq\u id、cls\u id和au\u id
给出的。这里需要一个列表来保存指针。如果我第一次收到带有
seq_id=0、cls_id=1和au_id=0的作业,我需要我的列表将指针保留在开始写入数据的文件中。当我接收到一个新作业时,比如说,使用
seq_id=0、cls_id=0和au_id=0
,必须将新数据写入输出文件中当前数据的左侧。因此,我必须读取指针列表[0][1][0],获取文件中这些数据的起始点,按新数据大小移动它们,然后写入新数据。最后,我需要更新被新数据移位的数据的指针列表[seq_id][cls_id][au_id]


我需要
指针列表\u标志
,以防止第一个作业再次更新
指针列表

为此,您可以使用
集合。defaultdict
。()

defaultdict
允许您指定类似
dict
的对象,但只要指定了一个尚未在
defaultdict
中的键,就会创建一个默认值

所以对于这个例子:

files = defaultdict(list)
pointers_list = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: 0)))

def worker(body):
    data = body['data']   
    file_id = body['file_id']
    seq_id = body['seq_id']
    cls_id = body['cls']
    au_id = body['au_id']

    if (file_id in files):
        current_pointer = getcurrentpointer()
        pointers_list[seq_id][cls_id][au_id] = current_pointer   
    else: 
        # do other things here
        [...]
        # Automatically creates entry in pointers list for seq_id -> cls_id -> au_id
        pointers_list[seq_id][cls_id][au_id] = 0     

    # If file_id in files then appends to list already there 
    # otherwise creates empty list for file_id entry and appends to the empty list    
    files[file_id].append(body['du']) 
注:

  • defaultdict参数必须是可调用的,因此必须使用
    lambda:
    函数
  • pointers\u list\u标志实际上是多余的,因为
    file\u id in files
    语句处理所有事情

谢谢您的回答。在编辑1中,我更好地解释了我要找的内容。我对你的编辑和你想做的事情有点困惑。对于
pointers\u list\u标志
点,如果您按照原始代码进行操作,您将看到无论
pointers\u list\u标志
的值是多少,如果
file\u id in files
和第二个if not,则执行第一个和第三个块中的代码。就您试图处理列表和保存记录而言,
defaultdict
正是此用例的对象,它或者在调用新键时创建一个新条目,或者为dict中已存在的键设置值。这是您试图对列表执行的操作。第一个作业进入else条件,将文件r/w指针初始化为零,并将指针值保存到指针列表[seq_id][cls_id][au_id]。如果我没有设置pointer_标志,第一个作业将转到第三个代码块并重置pointer_列表值。我在第三个块中有一些事情要做,第一个作业不必执行。getcurrentpointer()尚未实现,但它将返回当前的r/w指针(file.tell())。我将按照您的建议实施defaultdict列表并返回。非常感谢。