[英]Rearrange list of tuples by another sorted enumerated list
我有一個元組列表: a = [(10, 11), (5, 5), (2, 3), (6, 7), (8, 3), (9, 2)]
和一個簡單的列表值b = [10, 9, 10, 2, 8, 3]
。 然后我列舉第二個列表並出於某些目的對其進行排序。
b_enumerated = list(enumerate(b))
# [(0, 10), (1, 9), (2, 10), (3, 2), (4, 8), (5, 3)]
b_sorted = sorted(b_enumerated, key=lambda x: x[1], reverse=True)
# [(0, 10), (2, 10), (1, 9), (4, 8), (5, 3), (3, 2)]
現在我想根據第二個排序列表重新排列我的第一個列表,所以我希望得到[(10, 11), (2, 3), (5, 5), (8, 3), (9, 2), (6, 7)]
(原始列表的元組按有序列表的索引順序:0, 2, 1, 4, 5, 3),例如,我枚舉的第一個列表是[(0, (10, 11)), (1, (5, 5)), (2, (2, 3)), (3, (6, 7)), (4, (8, 3)), (5, (9, 2))]
。
我怎樣才能達到預期的效果? 也許我需要使用某種索引,因為對壓縮列表進行排序沒有幫助。
謝謝。
如果目的是使用b
a
排序,則無需枚舉b
並對枚舉的序列進行排序以首先構建b_sorted
的中間列表。
相反,您可以 zip b
使用a
進行排序,然后 output 僅在結果元組序列中的第二項:
[t for _, t in sorted(zip(b, a), reverse=True)]
這將返回:
[(10, 11), (2, 3), (5, 5), (8, 3), (9, 2), (6, 7)]
快速回答
a_sorted = [a[i[0]] for i in b_sorted]
簡要說明
您基本上是在說“將a[0]
發送到a_sorted[0]
,將a[1]
發送到a_sorted[2]
... 將a[i]
發送到a_sorted[b_sorted[i][0]]
”。
這可以通過代碼完成
a_sorted = [a[b_sorted[i][0]] for i in range(len(b_sorted))]
它工作正常,但可以通過迭代b_sorted
來縮短和整理。
a_sorted = [a[i[0]] for i in b_sorted]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.