给出以下列表:
my_list=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
我希望能够尽快高效地将子列表my_list[2:4]
与子列表my_list[7:10]
交换,以获得新列表:
我的尝试是:
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])
这确实打印了所需的输出,尽管这种方式在我看来很糟糕。在
有没有一种更简单、更优雅的方法来完成它,它不会为每个函数调用创建四个新列表?(我计划经常调用这个函数)
我不介意(实际上我更喜欢)更改原始列表,而不是每次函数调用都创建新实例。在
您可以在这里使用普通的交换技术(}是第一个(最左边)片。在
x,y = y,x
),但前提是以正确的顺序执行交换:x
必须是第二个(最右边)片,而{这是因为它将首先分配给
my_list[7:10]
,然后才分配给my_list[2:4]
。在如果以相反的顺序执行此操作,则首先分配给
my_list[2:4]
将更改右侧项的位置,因为子列表具有不同的长度,这将导致错误的结果。在性能方面,这可能比代码快,也可能不比代码快:这可能取决于列表和片的长度。您必须在典型的用例上测试它才能看到。在
我认为最好使用串联和切片。如果先传递列表,然后传递两个带有索引对的列表,则可以将列表切分并重新排列这两个子列表。请注意,}都以某种方式作为常规切片工作,开始编号包含在内,但结束编号不包含在内。在
indexA
和{可以指定切片。在
可以用
a, b = b, a
交换两个变量。在将以上两种情况结合起来:
注意-如果切片大小不同,顺序很重要:如果以相反的顺序交换,结果会不同,因为它会首先更改初始项(较低的索引),然后是更高的索引项(但是这些项将在第一个赋值时移到不同的位置)。
此外,切片不能重叠。
相关问题 更多 >
编程相关推荐