交换lis中的两个子列表

2024-10-03 02:37:17 发布

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

给出以下列表:

my_list=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

我希望能够尽快高效地将子列表my_list[2:4]与子列表my_list[7:10]交换,以获得新列表:

^{pr2}$

我的尝试是:

def swap(s1, s2, l):

    seg1=l[:s1.start]+l[s2]
    seg2=l[s1.stop : s2.start]
    seg3=l[s1]+l[s2.stop:]

    return seg1+seg2+seg3


print swap(slice(2,4), slice(7,10), [0,1,2,3,4,5,6,7,8,9,10,11,12])

这确实打印了所需的输出,尽管这种方式在我看来很糟糕。在

有没有一种更简单、更优雅的方法来完成它,它不会为每个函数调用创建四个新列表?(我计划经常调用这个函数)

我不介意(实际上我更喜欢)更改原始列表,而不是每次函数调用都创建新实例。在


Tags: 列表myslicestartliststop函数调用s2
3条回答

您可以在这里使用普通的交换技术(x,y = y,x),但前提是以正确的顺序执行交换:x必须是第二个(最右边)片,而{}是第一个(最左边)片。在

>>> my_list=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> my_list[7:10], my_list[2:4] = my_list[2:4], my_list[7:10]
>>> my_list
[0, 1, 7, 8, 9, 4, 5, 6, 2, 3, 10, 11, 12]

这是因为它将首先分配给my_list[7:10],然后才分配给my_list[2:4]。在

如果以相反的顺序执行此操作,则首先分配给my_list[2:4]将更改右侧项的位置,因为子列表具有不同的长度,这将导致错误的结果。在

性能方面,这可能比代码快,也可能不比代码快:这可能取决于列表和片的长度。您必须在典型的用例上测试它才能看到。在

我认为最好使用串联和切片。如果先传递列表,然后传递两个带有索引对的列表,则可以将列表切分并重新排列这两个子列表。请注意,indexA和{}都以某种方式作为常规切片工作,开始编号包含在内,但结束编号不包含在内。在

def replace(source, indexA, indexB):
    newList = source[:indexA[0]] + source[indexB[0]:indexB[1]]
    newList += source[indexA[1]:indexB[0]] + source[indexA[0]:indexA[1]]
    newList += source[indexB[1]:]
    return newList

myList = replace(myList, [2,4], [7,10])

可以指定切片。在

可以用a, b = b, a交换两个变量。在

将以上两种情况结合起来:

>>> my_list[7:10], my_list[2:4] = my_list[2:4], my_list[7:10]
>>> my_list
[0, 1, 7, 8, 9, 4, 5, 6, 2, 3, 10, 11, 12]

注意-如果切片大小不同,顺序很重要:如果以相反的顺序交换,结果会不同,因为它会首先更改初始项(较低的索引),然后是更高的索引项(但是这些项将在第一个赋值时移到不同的位置)。

此外,切片不能重叠。

相关问题 更多 >