列表与字典—>一维列表

这一期内容可以结合着与第一期一起看https://guidm.blog.csdn.net/article/details/130900129?spm=1001.2014.3001.5502
在这里插入图片描述

让我们来先做个题目:

1、输入一个整数n,要求输出[1,n]范围内的所有完数。

完数是一个正整数,该数恰好等于其所有不同真因子之和。

a = [6, 28, 496, 8128] 
try:
    while True:
        cnt = 0
        n = int(input())
        print(n, end=':')
        for i in a:
            if i <= n:
                cnt += 1
                print('',i,end='' )
            else:
                break
        if cnt == 0:
            print('NULL')
        else:
            print()
except EOFError:
    pass

一维列表

1、基本概念

一维列表的定义:列表名 = [列表值表]

列表名应是合法的用户标识符,列表值表可以为空,也可以有一个或多个元素,各个元素之间用逗号隔开。可以通过下标访问列表中的各个元素,下表从0开始。

一些列表的用法:

a = []
b = [1]
c = [1, 2, 3, 4, 5]
d = [0]*5 复制五个0创建列表
e = [1, 2, 3] + [4, 5, 6]#用+ 合并两个列表成为一个新的列表

可以用内置函数list( )创建空列表,列表的长度可以用内置函数len( )求得。

内置函数sorted(可迭代对象,key,reverse)

排序的时候按照关键字key对应函数的返回值进行排序,key的默认值为None,表示升序排序;逆序标记reverse默认为False,表示不进行逆序处理,若指定reverse为True,则将对排序结果逆序处理。

sorted()与列表名.sort不同之处在于前者不会改变列表,后者会改变列表。

2、一维列表的应用

2.1 逆序输出

输出若干个整数,然后按输入的相反顺序显示这些数据。

方案一:第一个数据除外,输出每个数据之前,先输出一个空格。

方案二:最后一个数据除外,输出每个数据之后,再输出一个空格。

#方案一:
a = list(map(int, input().split()))
n = len(a)
for i in range(n-1, -1, -1):
    if i != n-1:
        print('', end = ' ')
    print(a[i], end='')
print()

#方案二:
a = list(map(int, input().split()))
n = len(a)
cnt = 0
for i in range(n-1, -1, -1):
   cnt += 1
   if cnt > 1:
        print('', end='')
   print(a[i], end='')
print()

实际上,可以直接使用reverse进行逆置列表,如果要求数据之前间隔一个空格,则可以直接在这些可迭代对象之前加一个*,作为内置函数print()的参数数据进行输出。

a = list(map(int, input().split()))
a.reverse()
print(*a)

把*a作为print()函数的参数实际上是吧列表a中的各个元素逐个取出作为print()函数的参数。

2.2数位分离

输入一个整数n,要求输出其位数,并分别以正序和逆序输出各位数字。每两个数据之间用一个逗号分隔。

n = int(input())
a = [0]*10
i = 0
while n > 0:
    a[i] = n % 10
    n = n // 10
    i += 1
print(i, end='')
for j in range(i-1, -1, -1):
    print(',', a[j], sep='', end='')
for j in range(i):
    print(',', end='')
    print(a[j], end='')
print()

解读:把n中的各个数位上的数字分离出来,可以不断使用取余运算符%取得个位并存放在列表中,并用n=n//10去掉个位,直到n为0为止。

2.3约瑟夫环

有n个人围成一圈,从第1号开始进行1、2、3报数,凡报3者就退出,下一个又从1开始报数……知道最后只剩下一个人时为止。输入整数n,请问最后剩下者原来的位置是多少号。

n = int(input())
a = [True]*n   #定义长度为n的逻辑型列表,所有元素为True
j = -1         #下标变量j赋初值
cnt = 0        #报数计数器赋初值
m = n          #剩余人数计数器赋初值
while m>1:
    j = (j+1)%n
    if a[j] == False:
        continue
    cnt += 1
    if cnt %3 == 0:
        a[j] = False
        m -= 1
for i in range(n):
    if a[i] == True:
        print(i + 1)
        break

解读:开始时把一个逻辑型列表的所有元素的值都设为True表示相应的人在圈中,当剩余人数多余1人时,用下标j逐个扫描列表元素,检查当前下表对应的人是否已出圈,若已出圈则跳过,否则计数器cnt增加一,若计数器是三的倍数,则相应的人出圈,设为False。

2.4循环移位

在一行上先输入两位数n和m再接着输入n个整数构成一个数列,要求把前m个数循环移位到数列的右边。

a = list(map(int, input().split()))
n = a[0]
m = a[1]
a = a[2:]
for i in range(m):
    x = a[0]
    for j in range(1,n):
        a[j-1] = a[j]
    a[n-1] = x
print(*a)
2.5 小者靠前

第一行输入整数n,第二行输入n个整数到一个列表中,使得其中最小的一个数成为列表的第一个元素(首元素)。若有多个最小数,则首元素仅与最早出现的最小的数交换。

n = int(input())
a = list(map(int, input().split()))
k = 0
for i in range(1, n):
    if a[i]<a[k]:
        k = i
a[0],a[k] = a[k],a[0]
print(*a)
2.6 选择排序

第一行输入数据个数n,第二行输入n个整数构成整数数列,要求对该整数进行排序,使其升序排列。

n = int(input())
a = list(map(int, input().split()))
for i in range(0, n-1):
    k = i
    for j in range(i+1, n):
        if a[k] > a[j]:
            k = j
    if k!=i:
        a[i], a[k] = a[k], a[i]
print(*a)

对于n个数升序排列,共进行n-1趟排序,每一趟从待排序的数列中选出最小的一个数,通过交换操作放到当前的最前位置。

2.7冒泡排序

第一行输入数据个数n,第二行输入n个整数构成整数序列,要求对该整数进行排序,使其升序排列。、

n = int(input())
a = list(map(int, input().split()))
for i in range(0, n-1):
    for j in range(n-1-i):
        if a[j]>a[j+1]:
            a[j],a[j+1] = a[j+1],a[j]
print(*a)

对n个数升序排列,共进行n-1趟排序,每一趟依次比较相邻的两个数,若位置逆序则交换,将小者放在前面,大者而放在后面,每一趟排序结束时,把当前的最大数放到当前的最后位置。

猜你喜欢

转载自blog.csdn.net/m0_61901625/article/details/131066711
今日推荐