写点什么

python 内置数据结构 list、set、dict、tuple(一)

用户头像
若尘
关注
发布于: 2021 年 04 月 20 日
python内置数据结构list、set、dict、tuple(一)

汉诺塔问题

  • 规则:

  • 每次只能移动一个盘子

  • 任意一次移动,三个塔的状态必须是小盘子在上,大盘子在上

  • 方法:

  • n=1:直接把 A 上的一个盘子移动到 C 上,A->C

  • n=2:

  • 把小盘子从 A 放到 B 上,A->B

  • 把大盘子从 A 放到 C 上,A->C

  • 把小盘子从 B 放到 C 上,B->C

  • n=3:

  • 把 A 上的两个盘子,通过 C 移动到 B 上去,调用递归实现

  • 把 A 上剩下的一个最大盘子移动到 C 上,A->C

  • 把 B 上两个盘子,借助于 A,挪到 C 上去,调用递归

  • n=n:

  • 把 A 上的 n-1 个盘子,借助于 C,移动到 B 上去,调用递归

  • 把 A 上的最大盘子,也是唯一一个,移动到 C 上去,A->C

  • 把 B 上 n-1 个盘子,借助于 A,移动到 C 上去,调用递归


def hano(n, a, b, c):    '''        汉诺塔的递归实现    n:代表几个塔    a:代表第一个塔,开始的塔    b:代表第二个塔,中间过渡的塔    c:代表第三个塔,目标塔    '''    if n == 1:        print(a, "-->", c)        return None        '''    if n== 2:        print(a, "-->", b)        print(a, "-->", c)        print(b, "-->", c)        return None    '''
# 把n-1个塔,从a塔借助于c塔,挪到b塔上去 hano(n-1, a, c, b) print(a, "-->", c) # 把n-1个塔,从b塔,借助于a塔,挪到c塔上去 hano(n-1, b, a, c) a = 'A'b = 'B'c = 'C'
n = 1hano(n, a, b, c)
复制代码


A --> C
复制代码


n = 2hano(n, a, b, c)
复制代码


A --> BA --> CB --> C
复制代码


n = 3hano(n, a, b, c)
复制代码


A --> CA --> BC --> BA --> CB --> AB --> CA --> C
复制代码


n = 5hano(n, a, b, c)
复制代码


A --> CA --> BC --> BA --> CB --> AB --> CA --> CA --> BC --> BC --> AB --> AC --> BA --> CA --> BC --> BA --> CB --> AB --> CA --> CB --> AC --> BC --> AB --> AB --> CA --> CA --> BC --> BA --> CB --> AB --> CA --> C
复制代码

List(列表)

  • del:删除命令


# del 删除a = [1,2,3,4,5,6]del a[2]print(a)
复制代码


[1, 2, 4, 5, 6]
复制代码


# del 删除# 如果使用del之后,id的值和删除前不一样,则说明删除生成了一个新的Lista = [1,2,3,4,5,6]print(id(a))del a[2]print(id(a))print(a)
复制代码


17873451003601787345100360[1, 2, 4, 5, 6]
复制代码


# del一个变量后不能再继续使用此变量del aprint(a)
复制代码


---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-15-a09b634934b2> in <module> 1 # del一个变量后不能再继续使用此变量----> 2 del a 3 print(a)

NameError: name 'a' is not defined
复制代码

列表相加

# 使用加号连接两个列表a = [1,2,3,4,5]b = [5,6,7,8,9]d = ['a', 'b', 'c']c = a + b + dprint(c)
复制代码


[1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 'a', 'b', 'c']
复制代码


# 使用乘号操作列表# 列表直接跟一个整数想乘# 相当于把n个列表接在一起
a = [1,2,3,4,5]b = a * 3print(b)
复制代码


[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
复制代码


# 成员资格运算# 就是判断一个元素是否在列表list里边
a = [1,2,3,4,5,6]b = 8
# c的值是一个布尔值c = b in aprint(c)
b = 4print(b in a)
复制代码


FalseTrue
复制代码


# not ina = [1,2,3,4,5]b = 9
print(b not in a)
复制代码


True
复制代码

列表的遍历

  • for

  • while


# for in lista = [1,2,3,4,5]
# 挨个打印a里边的元素for i in a: print(i)
复制代码


12345
复制代码


# java, c++ 程序员写的python代码是这样的for i in range(0,len(a)):    print(a[i])    i += 1
复制代码


12345
复制代码


b = ["I love you"]
for i in b: print(i)
复制代码


I love you
复制代码


# range# in 后面的变量要求是可以迭代的内容for i in range(1,10):    print(i)    print(type(range(1,10)))
复制代码


123456789<class 'range'>
复制代码


# while循环访问list# 一般不用while遍历list
a = [1,2,3,4,5,6]length = len(a)# indx表示的是list的下标indx = 0while indx < length: print(a[indx]) indx += 1
复制代码


123456
复制代码


# 双层列表循环
# a为嵌套列表,或者叫双层列表a = [["one", 1], ["two", 2], ["three", 3]]
for k,v in a: print(k, "--", v)
复制代码


one -- 1two -- 2three -- 3
复制代码


# 双层列表循环变异
# a为嵌套列表,或者叫双层列表a = [["one", 1, "enis"], ["two", 2], ["three", 3,4,5,6,8]]
for k,v in a: print(k, "--", v)
复制代码


---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-44-db702adbc386> in <module> 4 a = [["one", 1, "enis"], ["two", 2], ["three", 3,4,5,6,8]] 5 ----> 6 for k,v in a: 7 print(k, "--", v)

ValueError: too many values to unpack (expected 2)
复制代码


# 双层列表循环变异
# a为嵌套列表,或者叫双层列表a = [["one", 1, "enis"], ["two", 2, "zwei"], ["three", 3, "drei"]]# 这个例子说明:k,v,w的个数应该跟解包出来的变量个数一致for k,v,w in a: print(k, "--", v, "--", w)
复制代码


one -- 1 -- enistwo -- 2 -- zweithree -- 3 -- drei
复制代码

列表内涵:List content

  • 通过简单的方法创作列表


# for 创建a = ['a', 'b', 'c']# 用List a创建一个List b# 下面的代码的含义是,对于所有a中的元素,逐个放入新列表b中b = [i for i in a]print(b)
复制代码


['a', 'b', 'c']
复制代码


# 对a中所有元素乘以10,生成一个新Lista = [1, 2, 3, 4, 5]# 用List a创建一个List b# 下面的代码的含义是,对于所有a中的元素,逐个放入新列表b中b = [i*10 for i in a]print(b)
复制代码


[10, 20, 30, 40, 50]
复制代码


# 还可以过滤原来List中的内容并放入新列表# 比如原有列表,需要把所有a中的偶数生成新的列表b
a = [x for x in range(1,35)] # 生成从1到34的一个列表# 把a中所有偶数生成一个新的列表 bb = [m for m in a if m % 2 == 0]print(b)
复制代码


[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34]
复制代码


# 列表生成式可以嵌套# 有两个列表a,ba = [i for i in range(1,4)]  # 生成List aprint(a)
b = [i for i in range(100,400) if i % 100 == 0]print(b)
# 列表生成是可以嵌套,此时等于两个for循环嵌套c = [m+n for m in a for n in b]print(c)
# 上面代码跟下面代码等价for m in a: for n in b: print(m+n, end=" ")print()
# 嵌套的列表生成也可以用条件表达式c = [m+n for m in a for n in b if m+n < 250]print(c)
复制代码


[1, 2, 3][100, 200, 300][101, 201, 301, 102, 202, 302, 103, 203, 303]101 201 301 102 202 302 103 203 303 [101, 201, 102, 202, 103, 203]
复制代码

关于列表的常用函数

# len:求列表长度a = [x for x in range(1,100)]print(len(a))
# max:求列表中的最大值# min:同理print(max(a))
b = ["man", "film", "python"]print(max(b))
复制代码


9999python
复制代码


# List:将其他格式的数据转换成Lista = [1,2,3]print(list(a))
复制代码


[1, 2, 3]
复制代码


s = "I love you"print(list(s))
复制代码


['I', ' ', 'l', 'o', 'v', 'e', ' ', 'y', 'o', 'u']
复制代码


# 把range产生的内容转换成listprint(list(range(12,19)))
复制代码


[12, 13, 14, 15, 16, 17, 18]
复制代码


发布于: 2021 年 04 月 20 日阅读数: 8
用户头像

若尘

关注

还未添加个人签名 2021.01.11 加入

还未添加个人简介

评论

发布
暂无评论
python内置数据结构list、set、dict、tuple(一)