Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Python 3.x_Nested Lists_Indices - Fatal编程技术网

Python 将平坦的一维索引转换为二维索引

Python 将平坦的一维索引转换为二维索引,python,python-3.x,nested-lists,indices,Python,Python 3.x,Nested Lists,Indices,假设我有一个列表,例如: x = [[0,1,2,3],[4,5],[6,7,8,9,10]] 我有我想要瞄准的元素的“平面”索引,也就是说,如果列表被平面化为1d列表,我想从列表中选择的元素的索引: flattened_indices = [0,1,4,9] # # # # flattened_list = [0,1,2,3,4,5,6,7,8,9,10] 如何转换1.d。指数转换为2.d。允许我从原始嵌套列表中恢复元素的索引?

假设我有一个列表,例如:

x = [[0,1,2,3],[4,5],[6,7,8,9,10]]
我有我想要瞄准的元素的“平面”索引,也就是说,如果列表被平面化为1d列表,我想从列表中选择的元素的索引:

flattened_indices = [0,1,4,9]

                  # #     #         #
flattened_list = [0,1,2,3,4,5,6,7,8,9,10]
如何转换1.d。指数转换为2.d。允许我从原始嵌套列表中恢复元素的索引?即,在本例中:

2d_indices = [(0,0), (0,1), (1,0), (2,3)]

以下是一种方法:

从对分导入对分 进口itertools 列表长度的累计和 def len_cumsumx: 返回ListItemTools.AccumerateMaplen,x 从累积长度列表中查找二维索引 def find_2d_idxc,idx: i1=二等分,idx 如果i1>0,则i2=idx-c[i1-1],否则idx 返回i1,i2 测验 x=[[0,1,2,3],[4,5],[6,7,8,9,10]] 指数=[0,4,9] 扁平化列表=[0,1,2,3,4,5,6,7,8,9,10] c=伦库姆 idx_2d=[在索引中查找_2d_idxc,i代表i] printidx_2d >>> [0, 0, 1, 0, 2, 3] 在idx_2d中为i1、i2打印[x[i1][i2] >>> [0, 4, 9]
如果您有许多平面索引,这比为每个索引迭代嵌套列表更有效。

我想您可以将这些索引对放在一个dict中,然后在末尾引用来自索引的dict并创建一个新列表:

x = [[0,1,2,3],[4,5],[6,7,8,9,10]]

indices = [0,4,9]

idx_map = {x: (i, j) for i, l in enumerate(x) for j, x in enumerate(l)}

result = [idx_map[x] for x in indices]
print(result)
其结果是:

[(0, 0), (1, 0), (2, 3)]

但这并不是最优的,因为它的二次运行时间用于创建idx_映射。使用对分的解决方案更为优化

如果你将列表展平并提取元素,而不是将索引转换为2D,那不是更容易吗?你可以通过查看列表的长度并做一些简单的数学运算,将索引转换为2D索引。你试过了吗?@AkshayNevrekar实际的问题比我使用的玩具模型要复杂一些,每个“子列表”实际上都是一个可变长度的子列表。因此,当第一个元素中可能有3个列表,但第二个元素中只有2个列表时,将列表展平是没有意义的,而且您还可以为每个元素重用索引,而不是多次展平。我没有测试它,可能在某个地方出现了一个错误,我不知道。这个想法是正确的。但是,您可以使用listitertools.acgregateMaplen,x而不是len_cumsum函数。这假设x包含递增顺序的自然数,即xx[i]=i,如果xx是扁平列表,并且不适用于任何其他情况,例如x=[['a','a','a','a'],['a','a'],['a','a']。