Python 将列表反排序回原始序列

Python 将列表反排序回原始序列,python,list,sorting,Python,List,Sorting,实际上,我有一个包含(价格、数量、总数)的元组列表。 我想对列表进行排序,允许用户删除列表中的项目,然后 然后把它放回原来的顺序减去删除的项目 需要注意的是元组中的值可以在列表中重复, 例如: 你不能真的做“反排序”,你能做的最好的是: aList = [(4.55, 10, 45.5), (4.55, 10, 45.5), (1.99, 3, 5.97), (1.99, 1, 1.99)] 你不能真的做“反排序”,你能做的最好的是: aList = [(4.55, 10, 45.5), (4

实际上,我有一个包含(价格、数量、总数)的元组列表。 我想对列表进行排序,允许用户删除列表中的项目,然后 然后把它放回原来的顺序减去删除的项目

需要注意的是元组中的值可以在列表中重复, 例如:

你不能真的做“反排序”,你能做的最好的是:

aList = [(4.55, 10, 45.5), (4.55, 10, 45.5), (1.99, 3, 5.97), (1.99, 1, 1.99)]
你不能真的做“反排序”,你能做的最好的是:

aList = [(4.55, 10, 45.5), (4.55, 10, 45.5), (1.99, 3, 5.97), (1.99, 1, 1.99)]
不能取消列表排序,但可以保留原始未排序索引以恢复位置

例如

如您所见,这适用于重复的值。

您无法取消列表排序,但可以保留原始未排序索引以恢复位置

例如


正如您所看到的,这适用于重复的值。

尝试此操作以取消排序列表

from operator import itemgetter

aList = [(4.55, 10, 45.5), (4.55, 10, 45.5), (1.99, 3, 5.97), (1.99, 1, 1.99)]

# In keyList:
# * every element has a unique id (it also saves the original position in aList)
# * list is sorted by some criteria specific to your records
keyList = sorted(enumerate(aList), key = itemgetter(1))

# User want to delete item 1
for i, (key, record) in enumerate(keyList):
    if key == 1:
        del keyList[i]
        break

# "Unsort" the list
theList = sorted(keyList, key = itemgetter(0))

# We don't need the unique id anymore
result = [record for key, record in theList]

尝试此操作以取消排序已排序列表

from operator import itemgetter

aList = [(4.55, 10, 45.5), (4.55, 10, 45.5), (1.99, 3, 5.97), (1.99, 1, 1.99)]

# In keyList:
# * every element has a unique id (it also saves the original position in aList)
# * list is sorted by some criteria specific to your records
keyList = sorted(enumerate(aList), key = itemgetter(1))

# User want to delete item 1
for i, (key, record) in enumerate(keyList):
    if key == 1:
        del keyList[i]
        break

# "Unsort" the list
theList = sorted(keyList, key = itemgetter(0))

# We don't need the unique id anymore
result = [record for key, record in theList]

你想如何根据什么对元组排序?price还是total?你不能取消排序。同样地,你也不能。你怎么能取消序列的排序呢?您必须改变主意以解决此问题,例如:找到“target”元素并将其从原始序列中删除。@使用“Unsort”可能是一个不幸的词语选择,但可以通过按先前顺序中记住的元素位置重新排列修改后的序列来达到预期效果。请看我的答案,看一个简单的例子。@user4815162342我已经看到并投票了:)我刚刚指出OP的想法是错误的。你想根据什么对元组进行排序?price还是total?你不能取消排序。同样地,你也不能。你怎么能取消序列的排序呢?您必须改变主意以解决此问题,例如:找到“target”元素并将其从原始序列中删除。@使用“Unsort”可能是一个不幸的词语选择,但可以通过按先前顺序中记住的元素位置重新排列修改后的序列来达到预期效果。请看我的答案,看一个简单的例子。@user4815162342我已经看到并投了赞成票:)我刚刚指出OP的想法是错误的。用户不会记住索引,必须由程序来处理这种情况。@vamosrafa,对不起,我不明白投反对票的原因。用户不必做任何事情。“记住”是什么意思?@vamosrafa我不明白你的意思。实际上这个答案看起来比另一个好+1@thefourtheye
remove
只删除列表中该值的第一个匹配项,因此重复项不会被删除。@frostnational,是的,但正如您所见,OP只删除特定索引中的1个值,正如此答案是用户不会记住索引一样,必须由程序处理此情况。@vamosrafa,对不起,我看不出投反对票的理由。用户不必做任何事情。“记住”是什么意思?@vamosrafa我不明白你的意思。实际上这个答案看起来比另一个好+1@thefourtheye
remove
只删除列表中该值的第一个匹配项,因此不会删除重复项。@是的,但正如您所看到的,OP只删除特定索引中的1个值,就像这个答案一样
import random
li = list(range(101))
random.shuffle(li)