2017-04-14 44 views
2

我有一个嵌套列表如下:结合嵌套列表,找到秩序

[ 
[ 
    [0.08, 0.34,0.68], 
    [0.20, 0.5, 0.92, 0.96], 
    [0.23, 0.52, 0.88, 0.91], 
    [inf] 
], 
[ 
    [0.60], 
    [inf], 
    [inf], 
    [0.05, 0.70, 0.79, 0.89] 
] 
] 

下一个级别的大小是固定的7x2例如。但最底层是可变的。

我想创建这样

[0.05,0.08,0.20,0.23,0.34,...] 

排序的组合列表,但我也希望号码属于例如0.05属于[1,3]等的列表。

任何人都可以帮助我吗?我可以将其组合成一个排序列表。但我找不到一个有效的方式来获取列表索引。

+0

解释'0.05' *属于* [1,3]'...你的意思是在索引'[1] [3]'? – TemporalWolf

+0

是的,这是正确的。 – deepAgrawal

回答

2

是这样的吗?

from numpy import inf 
lst = [[[0.08, 0.34,0.68],[0.20, 0.5, 0.92, 0.96], [0.23, 0.52, 0.88, 0.91], [inf]], [[0.60], [inf], [inf],[0.05, 0.70, 0.79, 0.89]]] 

sorted((e, i, j) for i in range(len(lst)) for j in range(len(lst[0])) for e in lst[i][j]) 

# [(0.05, 1, 3), 
# (0.08, 0, 0), 
# (0.2, 0, 1), 
# (0.23, 0, 2), 
# (0.34, 0, 0), 
# (0.5, 0, 1), 
# ... 

可以使用zip解压从价值指数:

vals, *inds = zip(*sorted((e, i, j) for i in range(len(lst)) for j in range(len(lst[0])) for e in lst[i][j])) 

vals 
# (0.05, 0.08, 0.2, 0.23, 0.34, 0.5, 0.52, 0.6, 0.68, 0.7, 0.79, 0.88, 0.89, 0.91, 0.92, 0.96, inf, inf, inf) 

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

可以递归解析嵌套到任意深度名单做这样的事情:

def nested_list_walker(nested_lists, prefix=()): 
    """Yields item, nested_index pairs.""" 
    try: 
     for index, nested_list in enumerate(nested_lists): 
      for output in nested_list_walker(nested_list, 
              prefix=prefix + (index,)): 
       yield output 
    except TypeError: 
     yield nested_lists, prefix 

在你的榜样,整理这个发生器产量:

[(0.08, (0, 0, 0)), 
(0.2, (0, 1, 0)), 
(0.23, (0, 2, 0)), 
(0.34, (0, 0, 1)), 
(0.5, (0, 1, 1)), 
(0.52, (0, 2, 1)), 
(0.6, (1, 0, 0)), 
(0.68, (0, 0, 2)), 
(0.7, (1, 3, 1)), 
(0.79, (1, 3, 2)), 
(0.88, (0, 2, 2)), 
(0.89, (1, 3, 3)), 
(0.91, (0, 2, 3)), 
(0.92, (0, 1, 2)), 
(0.96, (0, 1, 3)), 
(inf, (0, 3, 0)), 
(inf, (1, 1, 0)), 
(inf, (1, 2, 0))]