Python04——列表、元组以及字符串

列表

心得

列表是一种常用的数据结构,可以存储一些有关联,批量的数据。比如人员信息管理、图书信息管理等。

C语言中使用数组可以完成列表的功能,针对按索引查找元素功能十分快捷,但是其他常用功能又具有局限性,例如在任意位置插入元素任意扩大或缩小其容量等。为了弥补这些缺陷,通过设计巧妙的数据结构可以解决上述问题,例如设计一个带有双向指针的链表即可,该链条库通常具备初始化、增删查、排序等常用API接口。不过设计链表需要具备一定的编程基础,对于初学者而言并不友好。

typedef enum _DataType_e
{
    BOOL,
    CHAR,
    UCHAR,
    SHORT,
    USHORT,
    // ...
}DataType_e;

typedef struct  _List_s{
 list_s* Prev; 		  // 前一个节点
 list_s* Next; 		  // 后一个节点
 DataType_e DataType; // 数据类型
 void* Data; 		  // 存放数据的指针
}List_s;

List_s* Init(); 											 // 初始化
List_s* Add(DataType type, void* data); 					 // 增
List_s* Delete(unsigned int idx); 							 // 删
List_s* Insert(unsigned int idx, DataType type, void* data); // 插入
DataType Index(unsigned int idx, void* out); 				 // 获取

同样的,C#内部具有数组这一结构体,但是在此基础上,C#内部又标准化构建了List这一类,使用户能够很方便的使用列表的所有常见功能。

Python的列表功能和C#的十分相似,C在设计列表功能时也可以参考Python的设计理念和方法进行。有一点需要注意的是,列表变量本身在Python中是占内存的,但是命名的变量如果直接用等号链获取,Python只会将内存的地址赋值给变量。

习题

'''1、列表操作练习
列表lst 内容如下
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
请写程序完成下列操作:
1. 在列表的末尾增加元素15
2. 在列表的中间位置插入元素20
3. 将列表[2, 5, 6]合并到lst中
4. 移除列表中索引为3的元素
5. 翻转列表里的所有元素
6. 对列表里的元素进行排序,从小到大一次,从大到小一次
'''
lst1 = [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst2 = [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst3 = [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst4 = [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst5 = [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst6_1 = [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst6_2 = [2, 5, 6, 7, 8, 9, 2, 9, 9]
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
print('列表lst 内容:'+str(lst))
lst1.append(15)
print('1. 在列表的末尾增加元素15:'+str(lst1))
lst2.insert((int)(len(lst)/2), 20)
print('2. 在列表的中间位置插入元素20:'+str(lst2))
lst3.append([2, 5, 6])
print('3. 将列表[2, 5, 6]合并到lst中:'+str(lst3))
lst4.pop(3)
print('4. 移除列表中索引为3的元素:'+str(lst4))
lst5.reverse()
print('5. 翻转列表里的所有元素:'+str(lst5))
lst6_1.sort(reverse=False)
print('6.1. 对列表里的元素进行排序,从小到大一次:'+str(lst6_1))
lst6_2.sort(reverse=True)
print('6.2. 对列表里的元素进行排序,从大到小一次:'+str(lst6_2))

'''
2、修改列表
问题描述:
lst = [1, [4, 6], True]
请将列表里所有数字修改成原来的两倍
'''
lst = [1, [4, 6], True]


def double_lst(l):
    for i in range(0, len(l)):
        if type(l[i]) is int:
            l[i] <<= 1
        elif type(l[i]) is list:
            l[i] = double_lst(l[i])
    return l


a = double_lst(lst)
print(a)

'''
我们把符合下列属性的数组 A 称作山脉:

    A.length >= 3
    存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]

给定一个确定为山脉的数组,返回任何满足 A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1] 的 i 的值。

示例 1:
输入:[0,1,0]
输出:1

示例 2:
输入:[0,2,1,0]
输出:1

提示:
    3 <= A.length <= 10000
    0 <= A[i] <= 10^6
    A 是如上定义的山脉

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/peak-index-in-a-mountain-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
'''


class Solution:
    def peakIndexInMountainArray(self, A):
        for i in range(0, len(A) - 2):
            if A[i] < A[i+1] and A[i+1] > A[i+2]:
                return i+1


test = [0, 1, 0]
s = Solution()
print(s.peakIndexInMountainArray(test))

元组

心得

Python的列表和元组很像,但又有区别之处。

  1. 元组被创建后不能对其进行修改。
  2. 元组使用小括号,列表使用方括号[^1]。

学到后面有关元组的解压操作,这一概念类似于C#中采用object进行的组包和解包,站在C的角度看是一种类似于void*形变量。不同之处在于Python解压操作更加灵活,C#需要知道解包后元素的类型,C需要知道使用void*变量处的具体类型,当然,Python需要将解压元素进行一一对应。

习题

'''
1、元组概念
写出下面代码的执行结果和最终结果的类型
(1, 2)*2
(1, )*2
(1)*2
分析为什么会出现这样的结果.
'''
print('(1, 2)*2 = '+str((1, 2)*2))
print('对元组进行复制操作, 其类型为 tuple')
print('(1, )*2 = '+str((1, )*2))
print('对元组进行复制操作, 其类型为 tuple')
print('(1)*2 = '+str((1)*2))
print('对整型变量进行乘法运算, 其类型为 int')

'''
2、拆包过程是什么?
a, b = 1, 2
上述过程属于拆包吗?
可迭代对象拆包时,怎么赋值给占位符?
'''

'''
拆包是将压缩进元组的元素进行解压的操作。
上述过程属于拆包,因为 '1, 2' 的类型是元组。
第三个问题问度娘后的答案:
在可迭代对象拆包时,使用_(单个元素),*_(连续多个元素)进行占位。
'''

字符串

心得

在人机交互过程中,字符串是常用的信息载体。因此良好的字符串操作库对于绝大多数编程语言来说是必不可少的组成部分。对于字符串这类变量,在Python中直接使用字符串格式即可。在C中常用的字符串操作方法有,提前开辟固定的存储空间,使用printf进行格式化打印和使用sprintf获取格式化的字符串,但是针对正则表达式这类复杂的字符串查找功能,需要采用第三方库软件进行实现。在C#中有专门的类进行描述,即string,同时C#内部有针对正则表达式的常用类。

Python字符串的多行操作:使用注释格式实现。

Python字符串格式化输出。

习题

'''
1、字符串函数回顾
1. 怎么批量替换字符串中的元素?
2. 怎么把字符串按照空格进⾏拆分?
3. 怎么去除字符串⾸位的空格?
'''

'''
1. 使用 replace(old, new [, max]) 方法
2. 使用 split(str="", num)  方法
3. 使用 split(str=" ", 1)
'''
'''
2、实现isdigit函数
题目要求
实现函数isdigit, 判断字符串里是否只包含数字0~9
'''

def isdigit(string):
    """
    判断字符串只包含数字
    :param string:
    :return:
    """
    for i in string:
        if not(i >= '0' and i <= '9'):
            return False

    return True    
'''
3、leetcode 5题 最长回文子串
给定一个字符串 s ,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例:
输入: "babad"
输出: "bab"
输入: "cbbd"
输出: "bb"
'''

class Solution:
    def longestPalindrome(self, s: str) -> str:
        if(len(s) <= 1):
            return s
        dlt = 1
        start = 0
        i = 0
        while i < len(s):
            j = i - 1
            while j <= i:
                n = j
                m = i+1
                while n >= 0 and m < len(s) and s[m] == s[n]:
                    m += 1
                    n -= 1
                if(m != i+1 and dlt < m-n-1):
                    dlt = m-n-1
                    start = n+1
                j += 1
            i += 1
        return s[start:start+dlt]
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页