前言
Python切片有着很广泛的应用尤其是算法里,就比如:
此时我定义了一个字符串str”woxihuanshenyu”
print(str[0:-1])#输出第一个到倒数第二个所有字符print(str[2:5])#输出第三个到第五个字符print(str[2:])#输出第三个往后的所有字符print(str[0:-1])#输出第一个到倒数第二个所有字符 print(str[2:5])#输出第三个到第五个字符 print(str[2:])#输出第三个往后的所有字符print(str[0:-1])#输出第一个到倒数第二个所有字符 print(str[2:5])#输出第三个到第五个字符 print(str[2:])#输出第三个往后的所有字符
此时输出:
这里以图片展示了
![图片[1],Python中切片的用法,网络安全爱好者中心-神域博客网](https://img.godyu.com/2023/12/20231212162653292.png?imageView2/0/format/webp/q/75)
正文
那我们就可以知道负号是倒数的意思
那么我们将切片用于数组当中
我们简单引用OJ162http://acm.zzuli.edu.cn/problem.php?id=1162作为样例来讲述切片的用法(这里解释一下python的指针其实就是对象)另外OJ只要保证结果对就行 不一定要定义他们给的函数
我们先看要求:
![图片[2],Python中切片的用法,网络安全爱好者中心-神域博客网](https://img.godyu.com/2023/12/20231213032734698.png?imageView2/0/format/webp/q/75)
![图片[3],Python中切片的用法,网络安全爱好者中心-神域博客网](https://img.godyu.com/2023/12/20231212162854342.png?imageView2/0/format/webp/q/75)
答案:
下面八行代码就可以成功提交OJ
def f(a,n,k):a=a[-k:]+a[:-k]return an=int(input())a=list(map(str,input().split()))k=int(input())a=f(a,n,k)print(*a)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)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中切片的用法,网络安全爱好者中心-神域博客网](https://img.godyu.com/2023/12/20231212164906113.png?imageView2/0/format/webp/q/75)
怎么样,也不用调用任何库,简便吧,下面拓展为大家解释切片和改动一些代码让我们更能理解
先比较一下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;}#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; }#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]);}}#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]); } }#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# 读入nn = int(input())# 读入n个整数,转换为列表a = list(map(int, input().split()))# 读入kk = int(input())# 调用循环移动函数a = ringShift(a, n, k)# 输出移动后的数组,用空格隔开print(*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)# 定义循环移动函数 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函数也可以达到相同效果
代码3:
def f(a,n,k):a=a[-k:]+a[:-k]return an=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=' ')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=' ')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还有网安方面,希望大家看完能多去锻炼一下,也希望能和大家一同学习.
- 最新
- 最热
只看作者