对列表进行反向排序,保留相同数字的顺序

时间:2020-09-21 11:08:31

标签: python list sorting

我有一个看起来像这样的列表

lst = ['3.0', '3.0 (key)', '2.0', '2.0 (key)', '1.0', '1.0 (key)', '1.1', '1.1 (key)']

我想对它进行反向排序,以便它看起来仍然是相同的数字顺序,但是带有文本'(key)'的项应该放在第一位。

['3.0 (key)', '3.0', '2.0 (key)', '2.0', '1.0 (key)', '1.0', '1.1 (key)', '1.1']

到目前为止我一直在尝试的是

lst.sort(reverse=True)

反转整个列表而忽略数字顺序 导致:

['1.1', '1.1 (key)', '1.0 (key)', '1.0', '3.0', '3.0 (key)', '2.0 (key)', '2.0']

我想要的是

['1.0', '1.0 (key)', '1.1', '1.1 (key)', '2.0', '2.0 (key)', '3.0', '3.0 (key)']

2 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,

def _first_element(elements):
    return elements[0]
# First you zip the items to groups.
groups = zip(*[iter(self._takes)]*2)
# then sort the groups in reverse
zipped.sort(key=first_element, reverse=True)
then build a new list what 
new_list=[]
for item in zipped:
    new_list.append(item[-1])
    new_list.append(item[0])

> new_list
> ['1.0', '1.0 (key)', '1.1', '1.1 (key)', '2.0', '2.0 (key)', '3.0', '3.0 (key)']

答案 1 :(得分:-2)

也许我遗漏了一些东西,但是简单有什么问题呢?

>>> lst = ['3.0', '3.0 (key)', '2.0', '2.0 (key)', '1.0', '1.0 (key)', '1.1', '1.1 (key)']
>>> sorted(lst, reverse=True)
['3.0 (key)', '3.0', '2.0 (key)', '2.0', '1.1 (key)', '1.1', '1.0 (key)', '1.0']

编辑:解决OP问题:构建新列表,如果需要,交换最后一个项目,否则保持顺序,不需要成对的值:

list_ = ['3.5 (key)',
         '3.0', '3.0 (key)',
         '2.5',
         '2.0', '2.0 (key)',
         '1.5 (key)',
         '1.0', '1.0 (key)',
         '1.1', '1.1 (key)',
         '0.9']

summary = []

for item in list_:
    summary.append(item)
    if 2 <= len(summary):
       if item.split()[0] == summary[-2]:
          summary.insert(-1, summary.pop(-1))

# summary
['3.5 (key)', 
 '3.0 (key)', '3.0', 
 '2.5', 
 '2.0 (key)', '2.0', 
 '1.5 (key)', 
 '1.0 (key)', '1.0', 
 '1.1 (key)', '1.1', 
 '0.9']