基于表单的Python排序列表

2024-06-08 01:07:26 发布

您现在位置:Python中文网/ 问答频道 /正文

一般来说,我对编程还不熟悉,所以希望在这里真正扩展我的技能。我正在尝试编写一个脚本,从一个对象中获取字符串列表,然后根据我的设计模板对它们进行排序。任何不在模板中的项都将添加到末尾。你知道吗

我现在是这样做的,但是有人能提出一个更好/更有效的方法吗?你知道吗

    originalList = ['b', 'a', 'c', 'z', 'd']
    listTemplate = ['a', 'b', 'c', 'd']
    listFinal = []

    for thing in listTemplate:
        if thing in originalList:
            listFinal.append(thing)
            originalList.pop(originalList.index(thing))

    for thing in originalList:
            listFinal.append(thing)
            originalList.pop(originalList.index(thing))

Tags: 对象字符串in脚本模板forindex技能
3条回答

最后一步,您可以使用:

listFinal += originalList

它会把这些项目添加到最后。你知道吗

您可以使用listTemplate列表创建dict,这样就可以将昂贵的(O(N)list.index操作简化为O(1)查找。你知道吗

>>> lis1 = ['b', 'a', 'c', 'z', 'd']
>>> lis2 = ['a', 'b', 'c', 'd']

使用enumerate创建一个dict,其中项目作为键(考虑到项目是可散列的),索引作为值。你知道吗

>>> dic = { x:i for i,x in enumerate(lis2) }

现在dic看起来像:

{'a': 0, 'c': 2, 'b': 1, 'd': 3}

现在对于lis1中的每个项,我们需要检查它在dic中的索引,如果找不到键,我们将返回float('inf')。你知道吗

用作key的函数:

def get_index(key):
   return dic.get(key, float('inf'))

现在对列表排序:

>>> lis1.sort(key=get_index)
>>> lis1
['a', 'b', 'c', 'd', 'z']

试试这个:

originalList = ['b', 'a', 'c', 'z', 'd']
listTemplate = ['a', 'b', 'c', 'd']

order = { element:index for index, element in enumerate(listTemplate) }
sorted(originalList, key=lambda element: order.get(element, float('+inf')))

=> ['a', 'b', 'c', 'd', 'z']

工作原理如下:

  • 首先,我们为listTemplate中的每个元素建立一个字典,指出它相对于其他元素的相对顺序。例如a0b1等等
  • 然后我们对originalList进行排序。如果它的一个元素出现在order字典中,那么使用它的相对位置进行排序。如果不存在,则返回一个正的无穷大值-这将保证不在listTemplate中的元素将结束于末尾,并且它们之间没有进一步的排序。你知道吗

这个问题的解决办法虽然正确,但不是很好。特别是,每当您必须构建一个新列表时,请尝试使用列表理解,而不是显式循环/附加。“销毁”输入列表(在本例中使用pop())不是一个好的做法。你知道吗

相关问题 更多 >

    热门问题