[英]How can I solve this error that occurs when I try to sort a nested list based on another nested?
我试图将我的解决方案建立在此处提出的其他问题上,但它们不太奏效。
我有一个嵌套列表:
s = [[[921, 640], [4007, 49], [4821, 40]],
[[1270, 20], [1943, 393], [4821, 183]],
[[1300, 95], [857, 641], [4821, 83]]]
我想根据另一个嵌套列表的值对嵌套中索引 0 处的值进行排序。 另一个列表如下所示:
i = [[921, 4281, 4007], [1943, 1270, 4821], [4821, 1300, 857]]
如您所见, i
中的子列表的值与s
的子列表中索引 0 处的值对齐,但它们的顺序不同。 现在我想根据i
中的值对s
中的值进行排序,如下所示:
s_new = [[[921, 640],[4821, 40], [4007, 49]],
[[1943, 393],[1270, 20], [4821, 183]],
[[4821, 83],[1300, 95], [857, 641]]]
我尝试了基于其他问题的代码,并给出了类似的答案:
s_new = [(sorted(x, key=lambda item: i.index(item[0]))) for x in s]
但我得到了错误:
ValueError: 921 is not in list
我做错了什么,为什么会出现此错误?
我昨天问了这个问题,但它被标记为重复。 但是,链接的问题和答案无法解决我的问题。
您缺少嵌套级别,您可以这样做:
s = [[[921, 640], [4007, 49], [4821, 40]],
[[1270, 20], [1943, 393], [4821, 183]],
[[1300, 95], [857, 641], [4821, 83]]]
i = [[921, 4821, 4007], [1943, 1270, 4821], [4821, 1300, 857]]
s_new = [(sorted(x, key=lambda item: i[j].index(item[0]))) for j, x in enumerate(s)]
for x in s_new:
print(x)
Output
[[921, 640], [4821, 40], [4007, 49]]
[[1943, 393], [1270, 20], [4821, 183]]
[[4821, 83], [1300, 95], [857, 641]]
另请注意,您示例中的i
是4821
而不是4281
。 作为替代方案,您可以使用 zip 在两个列表上并行迭代:
s_new = [sorted(si, key=lambda x: ij.index(x[0])) for si, ij in zip(s, i)]
由于索引调用,上述两种方法是O(n*n)
,对于更长的列表最好使用查找字典,例如:
def sort(ls, order):
priority = {k: p for p, k in enumerate(order)}
return sorted(ls, key=lambda x: priority[x[0]])
s_new = [sort(si, ij) for si, ij in zip(s, i)]
使用字典使其成为标准排序算法的成本O(n log n)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.