python 如何对元组列表进行排序,但其中一个特定的元组是第一个?

u0njafvf  于 2022-12-10  发布在  Python
关注(0)|答案(2)|浏览(217)

我在做一个应用程序来寻找送货的最佳路径。
送货送过来的他道:

[
    ('0', '1'),
    ('1', '2'),
    ('0', '2'),
    ('2', '0')
]

......其中每对数字都是一个位置,最小的数字更接近。它们还会将它们的起点发送给我。例如:2 .
我做了一个从低到高排序的函数:

def lowToHigh(trajet):
    trajet_opti = trajet
    print(sorted(trajet_opti))
    

lowToHigh([
    ('0', '1'),
    ('1', '2'),
    ('0', '2'),
    ('2', '0')
])

输出如下:

[('0', '1'), ('0', '2'), ('1', '2'), ('2', '0')]

我需要一个函数,它将起始编号的元组放在第一位:

def starting_tuple():
    starting_number = 2
    .
    .
    .

它会传回类似下列的内容:

[('2', '0'), ('0', '1'), ('0', '2'), ('1', '2')]
wko9yo5t

wko9yo5t1#

使用key进行排序,该key添加另一个元组元素,表示列表项是否等于起始点。

>>> path = [
...     ('0', '1'),
...     ('1', '2'),
...     ('0', '2'),
...     ('2', '0')
... ]
>>> sorted(path, key=lambda c: (c[0] != '2', c))
[('2', '0'), ('0', '1'), ('0', '2'), ('1', '2')]

表达式c[0] != '2'对于起始点将为False(0),对于所有其他点将为True(1),这将强制起始点位于列表的开头。如果有多个起始点,则它们将相对于彼此正常排序。

t2a7ltrp

t2a7ltrp2#

要对元组列表进行排序,使具有起始编号的元组排在第一位,只需遍历元组列表并检查每个元组是否包含起始编号。如果包含,则将该元组移到列表的前面。下面是一个实现该操作的示例:

def starting_tuple(trajet, starting_number):
    # Iterate through the list of tuples
    for i, tup in enumerate(trajet):
        # Check if the tuple contains the starting number
        if starting_number in tup:
            # If it does, move the tuple to the front of the list
            trajet.insert(0, trajet.pop(i))
            break
    
    # Return the sorted list of tuples with the starting tuple first
    return trajet
    enter code here

下面是如何使用此函数的示例:

trajet = [    ('0', '1'),    ('1', '2'),    ('0', '2'),    ('2', '0')]

starting_number = 2

print(starting_tuple(trajet, starting_number))
# Output: [('2', '0'), ('0', '1'), ('0', '2'), ('1', '2')]

请注意,此函数假定起始编号始终存在于元组列表中。您可能需要添加一些额外的错误检查,以处理起始编号不存在于列表中的情况。

相关问题