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

举报
ruochen 发表于 2021/03/28 02:55:03 2021/03/28
【摘要】 汉诺塔问题 规则: 每次只能移动一个盘子任意一次移动,三个塔的状态必须是小盘子在上,大盘子在上 方法: n=1:直接把A上的一个盘子移动到C上,A->Cn=2: 把小盘子从A放到B上,A->B把大盘子从A放到C上,A->C把小盘子从B放到C上,B->C n=3: 把A上的两个盘子,通过C移动到B上去,调用递归实现把A上剩下的一个最大盘子移动到C...

汉诺塔问题

  • 规则:
    1. 每次只能移动一个盘子
    2. 任意一次移动,三个塔的状态必须是小盘子在上,大盘子在上
  • 方法:
    1. n=1:直接把A上的一个盘子移动到C上,A->C
    2. n=2:
      1. 把小盘子从A放到B上,A->B
      2. 把大盘子从A放到C上,A->C
      3. 把小盘子从B放到C上,B->C
    3. n=3:
      1. 把A上的两个盘子,通过C移动到B上去,调用递归实现
      2. 把A上剩下的一个最大盘子移动到C上,A->C
      3. 把B上两个盘子,借助于A,挪到C上去,调用递归
    4. n=n:
      1. 把A上的n-1个盘子,借助于C,移动到B上去,调用递归
      2. 把A上的最大盘子,也是唯一一个,移动到C上去,A->C
      3. 把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 = 1
hano(n, a, b, c) 
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
A --> C

  
 
  • 1
n = 2
hano(n, a, b, c)

  
 
  • 1
  • 2
A --> B
A --> C
B --> C

  
 
  • 1
  • 2
  • 3
n = 3
hano(n, a, b, c)

  
 
  • 1
  • 2
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
n = 5
hano(n, a, b, c)

  
 
  • 1
  • 2
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
A --> B
C --> B
C --> A
B --> A
C --> B
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
B --> A
C --> B
C --> A
B --> A
B --> C
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

List(列表)

  • del:删除命令
# del 删除
a = [1,2,3,4,5,6]
del a[2]
print(a)

  
 
  • 1
  • 2
  • 3
  • 4
[1, 2, 4, 5, 6]

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
1787345100360
1787345100360
[1, 2, 4, 5, 6]

  
 
  • 1
  • 2
  • 3
# del一个变量后不能再继续使用此变量
del a
print(a)

  
 
  • 1
  • 2
  • 3
---------------------------------------------------------------------------

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

列表相加

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
[1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 'a', 'b', 'c']

  
 
  • 1
# 使用乘号操作列表
# 列表直接跟一个整数想乘
# 相当于把n个列表接在一起

a = [1,2,3,4,5]
b = a * 3
print(b)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

  
 
  • 1
# 成员资格运算
# 就是判断一个元素是否在列表list里边

a = [1,2,3,4,5,6]
b = 8

# c的值是一个布尔值
c = b in a
print(c)

b = 4
print(b in a)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
False
True

  
 
  • 1
  • 2
# not in
a = [1,2,3,4,5]
b = 9

print(b not in a)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
True

  
 
  • 1

列表的遍历

  • for
  • while
# for in list
a = [1,2,3,4,5]

# 挨个打印a里边的元素
for i in a: print(i)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
1
2
3
4
5

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

  
 
  • 1
  • 2
  • 3
  • 4
1
2
3
4
5

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
b = ["I love you"]

for i in b: print(i)

  
 
  • 1
  • 2
  • 3
  • 4
I love you

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
1
2
3
4
5
6
7
8
9
<class 'range'>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
# while循环访问list
# 一般不用while遍历list

a = [1,2,3,4,5,6]
length = len(a)
# indx表示的是list的下标
indx = 0
while indx < length: print(a[indx]) indx += 1

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
1
2
3
4
5
6

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
# 双层列表循环

# a为嵌套列表,或者叫双层列表
a = [["one", 1], ["two", 2], ["three", 3]]

for k,v in a: print(k, "--", v)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
one -- 1
two -- 2
three -- 3

  
 
  • 1
  • 2
  • 3
# 双层列表循环变异

# a为嵌套列表,或者叫双层列表
a = [["one", 1, "enis"], ["two", 2], ["three", 3,4,5,6,8]]

for k,v in a: print(k, "--", v)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
---------------------------------------------------------------------------

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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
# 双层列表循环变异

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
one -- 1 -- enis
two -- 2 -- zwei
three -- 3 -- drei

  
 
  • 1
  • 2
  • 3

列表内涵:List content

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
['a', 'b', 'c']

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
[10, 20, 30, 40, 50]

  
 
  • 1
# 还可以过滤原来List中的内容并放入新列表
# 比如原有列表,需要把所有a中的偶数生成新的列表b

a = [x for x in range(1,35)] # 生成从1到34的一个列表
# 把a中所有偶数生成一个新的列表 b
b = [m for m in a if m % 2 == 0]
print(b)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34]

  
 
  • 1
# 列表生成式可以嵌套
# 有两个列表a,b
a = [i for i in range(1,4)]  # 生成List a
print(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
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
[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]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

关于列表的常用函数

# len:求列表长度
a = [x for x in range(1,100)]
print(len(a))

# max:求列表中的最大值
# min:同理
print(max(a))

b = ["man", "film", "python"]
print(max(b))

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
99
99
python

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

  
 
  • 1
  • 2
  • 3
[1, 2, 3]

  
 
  • 1
s = "I love you"
print(list(s))

  
 
  • 1
  • 2
['I', ' ', 'l', 'o', 'v', 'e', ' ', 'y', 'o', 'u']

  
 
  • 1
# 把range产生的内容转换成list
print(list(range(12,19)))

  
 
  • 1
  • 2
[12, 13, 14, 15, 16, 17, 18]

  
 
  • 1

文章来源: ruochen.blog.csdn.net,作者:若尘,版权归原作者所有,如需转载,请联系作者。

原文链接:ruochen.blog.csdn.net/article/details/90299618

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。