我有一个这样的嵌套列表:
[
[
[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 :(得分: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 :(得分: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))]