master
/ 5.1.3 序列拼接与重复.ipynb

5.1.3 序列拼接与重复.ipynb @masterview markup · raw · history · blame

Notebook

序列拼接与重复

字符串、元组与列表等序列类型都支持拼接与重复的操作。

序列拼接是通过“+”将两个相同类型的序列拼接为一个包含参与拼接的序列中所有元素的新序列。

In [5]:
# 字符串拼接
first_name = input()  # 输入名
last_name = input()   # 输入姓

# 输出姓名
full_name = last_name + first_name  # 将姓与名拼接为一个字符串
print(full_name)                    # 赵广辉,  拼接后是一个对象,输出时中间无空格
print(last_name + first_name)       # 赵广辉,  拼接后是一个对象,输出时中间无空格
print(last_name, first_name)        # 赵 广辉,输出多个对象时,默认中间有空格
3645
3645
36 45

列表拼接为新的列表对象

In [2]:
stu_name = ['李明']
score_2021 = [84, 80, 95, 88]
score_2022 = [96, 76, 65, 85, 98, 55]

stu_score = stu_name + score_2021 + score_2022  # 3个列表拼接到一起
print(stu_score)  # ['李明', 84, 80, 95, 88, 96, 76, 65, 85, 98, 55]
['李明', 84, 80, 95, 88, 96, 76, 65, 85, 98, 55]
In [ ]:
stu_name = ('李明',)  # 注意括号中的逗号不可少,('李明')类型为字符串<class 'str'>
score_2021 = (84, 80, 95, 88)
score_2022 = (96, 76, 65, 85, 98, 55)

stu_score = stu_name + score_2021 + score_2022
print(stu_score)  # ('李明', 84, 80, 95, 88, 96, 76, 65, 85, 98, 55)

序列重复 s * n 是将一个序列 s 乘以一个整数 n产生一个新序列,新序列是 s 中的元素重复 n 次。

In [4]:
print('-' * 30)             # 字符串'-' 重复30次,得到新字符串'------------------------------'
print(f'{"欢迎光临":^30}')  # 30表示占30字符宽度,^ 表示居中对齐
print('-' * 30)
------------------------------
             欢迎光临             
------------------------------

序列重复时,当 n 小于或等于0时会被当作 0 来处理,此时序列重复0 次的操作将产生一个空序列。

In [ ]:
print('-' * 0)     # 输出空字符串
print('-' * (-5))  # 输出空字符串

实例 6.5 数据脱敏

手机号属于个人隐私信息,编程将用户输入的手机号的4-7位用“*”替换。输入格式为: 11位数字的手机号码,如:13912345678。

In [ ]:
tel = input()                            # 输入13213213211
tel_mask = tel[:3] + '*' * 4 + tel[-4:]  # 字符串切片、拼接和重复
print(tel_mask)                          # 132****3211

实例 6.6 约瑟夫环问题

有20个人围坐在一张圆桌周围,从第1个人开始报数,数到3的那个人出列,他的下一个人又从1开始报数,数到3的那个人又出列;
依此规律重复下去,直到圆桌周围的人数少于3时结束,循环输出每次出列的人和剩下的人的序号。

20个人围成一个圈可以用一个列表来表示:
In [ ]:
joseph_ring = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
In [ ]:
每次将列表的第3个元素去除可以切片取前2个元素joseph_ring[:2]拼接到列表从第4个元素到末尾的切片joseph_ring[3:]
In [ ]:
joseph_ring = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
joseph_ring = joseph_ring[3:] + joseph_ring[:2]  # 跳过第3个元素
print(joseph_ring)  # [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 2]
In [ ]:
joseph_ring = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
while len(joseph_ring) > 2:          # 列表长度大于m-1时,去掉第m个元素
    print(joseph_ring[2], end=' ')   # 输出当前出列的元素
    joseph_ring = joseph_ring[3:] + joseph_ring[:2]  # 两个列表拼接为一个新列表
    print(joseph_ring)               # 输出列表中剩余元素

练一练

约瑟夫环问题可以扩展为一圈共有n个人,从 1 开始报数,报到m的人出列,然后重新开始报数,剩余人数小于m时停止,输出最后剩余人的序号。

提示: 程序中用split()函数把用空格分隔的输入切分为包含2个值的列表,map()函数将这个列表中的所有值映射为参数指定的类型,此处为整数。 再用多变量赋值的方法将这两个整数值分别赋值给n和m。 约瑟夫环中的元素可以用range产生并用list()函数转为列表
In [ ]:
n, m = map(int, input().split())     # 同一行内用空格分隔的输入切分为列表,并映射为整数分别赋值给n,m  
joseph_ring = list(range(1, n + 1))  # 构造一个元素 1 到 n 的列表
# 补充你的代码
测试用例: 输入: 41 3 输出: [16, 31]