Python中切片的用法

前言

Python切片有着很广泛的应用尤其是算法里,就比如:

此时我定义了一个字符串str”woxihuanshenyu”

print(str[0:-1])#输出第一个到倒数第二个所有字符
print(str[2:5])#输出第三个到第五个字符
print(str[2:])#输出第三个往后的所有字符

此时输出

这里以图片展示了

图片[1],Python中切片的用法,网络安全爱好者中心-神域博客网

正文

那我们就可以知道负号是倒数的意思

那么我们将切片用于数组当中

我们简单引用OJ162http://acm.zzuli.edu.cn/problem.php?id=1162作为样例来讲述切片的用法(这里解释一下python的指针其实就是对象)另外OJ只要保证结果对就行 不一定要定义他们给的函数

我们先看要求:

图片[2],Python中切片的用法,网络安全爱好者中心-神域博客网
图片[3],Python中切片的用法,网络安全爱好者中心-神域博客网

答案:

下面八行代码就可以成功提交OJ

def f(a,n,k):
    a=a[-k:]+a[:-k]
    return a
n=int(input())
a=list(map(str,input().split()))
k=int(input())
a=f(a,n,k)
print(*a)

输出结果:

图片[4],Python中切片的用法,网络安全爱好者中心-神域博客网

怎么样,也不用调用任何库,简便吧,下面拓展为大家解释切片和改动一些代码让我们更能理解

先比较一下C和C++代码:

C和C++的代码均引用网上的(非本人编写)

下面是C语言代码来源:https://blog.csdn.net/vivi_cin/article/details/104936834

#include<stdio.h>
#include<stdlib.h>

// 逆序操作函数
void reverse(int *a,int l,int r){
    int i,j,t;
    for(i=l;i<=r;i++){
        t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
}

// 循环移位函数
void ringShift(int *a, int n, int k){ 
    // 循环移动后的数值仍然存入数组a中
    // 右移动 右边k为分割线
    int i;
    
    // 将数组a的前半部分逆序
    reverse(a,0,n-k-1);
    // 将数组a的后半部分逆序
    reverse(a,n-k,n-1);
    // 将整个数组a逆序
    reverse(a,0,n-1);
    
    // 打印移位后的数组a的元素
    for(i=0;i<n;i++)
        printf("%d ",a[i]);
    printf("\n");
}

int main(){
    int n,i,*a,k;
    
    scanf("%d",&n);
    a=(int *)malloc(sizeof(int)*(n+1));
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&k);
    
    ringShift(a,n,k);
    
    return 0;
}

下面是C++代码:来源https://codeantenna.com/a/VCnT18ST1g

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
void ringShift(int *a, int n, int k);
int main(){
	int n, k, i;
	cin >> n;
	int* a = (int *)malloc(sizeof(int)*n);
	for (i = 0; i < n; i++)
		cin >> *(a + i);
	cin >> k;
	ringShift(a, n, k);
	return 0;
}
void ringShift(int *a, int n, int k){
	int* b = (int *)malloc(sizeof(int)*n);
	int i;
	for (i = 0; i < k; i++){
		b[i] = a[n - k + i];
	}
	int c = 0;
	for (i = k; i < n; i++){
		b[i] = a[c++];
	}
	for (i = 0; i < n; i++){
		printf("%d ", b[i]);
	}
}

可以看出很麻烦,以前我能看下去,但是自从我学了python之后就看不下去了(

拓展

下面是为方便大家理解Python切片,为此代码添加了注释

a[-k:] 就是最后k个元素 a[:-k]就是除了最后k个元素让后重新赋值给a *a就是以数组形式输出

# 定义循环移动函数
def ringShift(a, n, k):
  # 使用切片操作实现循环移动
  a = a[-k:] + a[:-k] # -k表示从右边数第k个元素,-k:表示从右边数第k个元素到末尾的切片
  return a

# 读入n
n = int(input())

# 读入n个整数,转换为列表
a = list(map(int, input().split()))

# 读入k
k = int(input())

# 调用循环移动函数
a = ringShift(a, n, k)

# 输出移动后的数组,用空格隔开
print(*a)

对于为什么输出的是*a 因为此时*a作为一个单独的对象输出,如果你去掉*那么就会输出一整个数组

问:我是强迫症,可以不用*a输出么?

答:可以

用enumerate函数也可以达到相同效果

切记:不要用 for x in range(len(a)): 因为此时此刻索引和元素已经改变 而enumerate就可以完美解决这个这个问题

代码3:

def f(a,n,k):
    a=a[-k:]+a[:-k]
    return a
n=int(input())
a=list(map(str,input().split()))
k=int(input())
a=f(a,n,k)
# 用enumerate函数遍历列表a,同时得到索引和元素
for x, val in enumerate(a):
    # 只打印元素,不打印索引
    print(val,end=' ')

这样提交上去也是对的

切片还有更为广泛的用法,不仅仅是ACM还有网安方面,希望大家看完能多去锻炼一下,也希望能和大家一同学习.

------本文已结束,感谢您的阅读------
THE END
喜欢就支持一下吧
点赞13 分享
评论 共1条

请登录后发表评论