列表的练习3

import random
''' 
基础题 之前已经发布过 简单回顾即可
'''

# 1.自定义一个数字列表,获取这个列表中的最小值
ages = [1, -3, 2, 5, -4, 99, 7, 8, 5, 3]

min1 = ages[0]

for n in ages:

    if n < min1:
        min1 = n

print(min1)

# 2. 自定义一个数字列表,元素为10个, 找出列表中最大数连同下标一起输出
ages = [1, -3, 2, 5, -4, 99, 7, 8, 5, 3]

max1 = ages[0]
index1 = 0

for i, n in enumerate(ages):

    if n > max1:
        max1 = n
        index1 = i

print(max1, index1)

# 3. 自定义一个数字列表,求列表中第二大数的下标
ages = [1, -3, 2, 5, -4, 99, 7, 8, 5, 3]
max1 = max(ages)

max2 = ages[0]
index2 = 0

for i, n in enumerate(ages):

    if n == max1:
        continue

    if n > max2:
        max2 = n
        index2 = i

print(max2, index2)

# 4. B哥去参加青年歌手大奖赛 ,有10个评委打分 ,(去掉一个最高分一个最低分)求平均分
scores = [33, 44, 88, 88, 33, 66, 77, 88, 44, 55]
# sum,max,min,len  可以用也可以做不用的
scores.remove(max(scores))
scores.remove(min(scores))
avg = sum(scores) / len(scores)
print(f'平均分为 {avg}')

# 参考答案
avg_scores = (sum(scores) - max(scores) - min(scores)) / (len(scores) - 2)
print(avg_scores)

'''
min1 = scores[0]
max1 = scores[0]
for n in scores:

    if n > max1:
        max1 = n
        scores.remove(max1)

    if n < min1:
        min1 = n
        scores.remove(max1)

s = 0
c = 0
for m in scores:
    s += m
    c += 1
print(f'平均分为 {s/c}')

'''
# 5. 定义列表,存放5个学生的成绩【成绩值自己设定】,获得成绩之和,平均成绩,最小成绩,最大成绩。
scores2 = [66, 77, 88, 99, 100]
sum1 = sum(scores2)
avg1 = sum(scores2) / len(scores2)
min1 = min(scores2)
max1 = max(scores2)
print(f'''
最低分为 {min1}
最高分为 {max1}
总分为 {sum1}
平均分为 {avg1}
''')

# 参考答案
s = sum(scores2)
min1 = min(scores2)
max1 = max(scores2)
avg = s / len(scores2)   # 直接写 avg = s / 5 也可以  题目已经说了5个学生
print(s, max1, min1, avg)

'''
scores = [66, 77, 88, 99, 100]

min1 = scores[0]
max1 = scores[0]

for n in scores:

    if n > max1:
        max1 = n

    if n < min1:
        min1 = n

s = 0
c = 0
for m in scores:
    s += m
    c += 1
    
print(f'最低分为 {min1}')
print(f'最高分为 {max1}')
print(f'总分为 {s}')
print(f'平均分为 {s/c}')

'''

# 6. 将一个列表逆序输出, 提示: range(6,-1,-1), [::-1],reverse
list1 = list(range(6, -1, -1))
# print(list1)
list1.reverse()     # reverse会直接改变原列表,切片不会
print(list1)

# 参考答案
n = [2, 3, 1, 88, -2]
print(n[::-1])  # 推荐使用切片,不会改变原列表

# 参考答案二  麻烦 不推荐
for i in range(4, -1, -1):
    print(n[i])
'''
print(list1[::-1])

'''


# 7.完成猜拳游戏
#         -----------------------------
#         请输入你的选择:
#         1. 石头
#         2. 剪刀
#         3. 布
#         -----------------------------
#         如: 你的选择是【布】, 电脑的选择是【石头】
#         恭喜你获得了胜利!
computer = random.randint(1, 3)
print(computer)
print('''
-----------------------------
请输入你的选择(1/2/3):
1. 石头
2. 剪刀
3. 布
-----------------------------
''')
# 石头 > 剪刀
# 剪刀 > 布
# 布 > 石头
me = int(input('输入你的选择:'))

if computer == me:
    print('平局')

elif computer == 1 and me == 3 or computer == 2 and me == 1 or computer == 3 and me == 2:
    print('恭喜你获得了胜利!')

else:
    print('很遗憾,你输了')


# 参考答案:
me = int(input('输入你的选择:'))
print(computer)

if me - computer == -1 or me-computer == 2:
    print('恭喜你获得了胜利!')

elif me == computer:
    print('平局')

else:
    print('很遗憾,你输了')

"""
进阶题:可以使用内置函数
"""

# 1.给定一个列表:将列表中指定的某个元素全部删除: count, remove
list2 = [2, 3, 1, 5, 8, 2, 2, 2, 9, 10]

n = int(input('请输入要删除的元素n'))
for i in range(list2.count(n)):
    list2.remove(n)

print(list2)

# 参考答案
n = [3, 3, 4, 5, 6, 3, 3, 2]
for i in range(n.count(3)):
    n.remove(3)
print(n)

'''
list2 = [2, 3, 1, 5, 8, 2, 2, 2, 9, 10]

n = int(input('请输入要删除的元素n'))
while n in list2:
    list2.remove(n)
    
print(list2)

'''

# 2.自定义一个列表,最大的与第一个元素交换,最小的与最后一个元素交换,输出列表(不考虑特殊情况)
list1 = [2, 3, 4, 5, -6, 7, 8, 1]
# 提示: 要获取最大值和最小值的下标
# 交换列表的元素,要使用下标
# list1[0], list1[2] = list1[2], list1[0]
a = list1.index(max(list1))
b = list1.index(min(list1))
list1[a], list1[0] = list1[0], list1[a]
list1[-1], list1[b] = list1[b], list1[-1]
print(list1)

# 参考答案
# 最大的与第一个元素交换
max_index = list1.index(max(list1))
list1[0], list1[max_index] = list1[max_index], list1[0]
# print(list1)
# 最小的与最后一个元素交换
min_index = list1.index(min(list1))
list1[-1], list1[min_index] = list1[min_index], list1[-1]
# print(list1)

# 3,对称列表. 传入一个列表,元素类型与个数皆未知,返回新列表,由原列表的元素正序反序拼接而成;
# 如传入["One", "Two", "Three"] 返回['One', 'Two', 'Three', 'Three', 'Two', 'One']
list2 = ["One", "Two", "Three"]
list3 = list2.copy()
list3.reverse()
print(list2 + list3)

# 参考答案一样
# 参考答案二 更推荐  必须掌握
print(list2 + list2[::-1])

'''
list2 = ["One", "Two", "Three"]
list3 = list2[:]
list2.extend(list3)
print(list2)
'''

# 4, 给定一个不存在重复元素的整数列表,例如[6 ,4 ,7 ,2 ,5 ,8]和一个数字,例如10,
# 找出两个元素(或同一个元素加自身),并且使这两个数的和为给定数字,并打印出来
# 例如[6 ,4 ,7 ,2 ,5 ,8]和数字10. 打印结果为: 6,4  2,8  5,5

# 提示: 需要使用for循环嵌套
list3 = [6, 4, 7, 2, 5, 8]
n = 10

for i in range(len(list3)):

    for j in range(i, len(list3)):                      # 设置起始值为i 加过的数就不继续加前面的数 避免出现类似4+6、6+4的重复

        # print(list3[i], list3[j], list3[i]+list3[j])
        if list3[i]+list3[j] == n:
            print(list3[i], list3[j])

# 参考答案二--错误写法:  这个方法就遍历更多次,得到的结果有重复 与题干不相符 所以不能使用该方法
list3 = [6, 4, 7, 2, 5, 8]
n = 10

for n1 in list3:

    for n2 in list3:

        if n1 + n2 == n:
            print(n1, n2)

# 参考答案三
list3 = [6, 4, 7, 2, 5, 8]
n = 10

for i, n1 in enumerate(list3):

    for j in range(i, len(list3)):
        n2 = list3[j]
        # print(n1, n2)
        if n1 + n2 == n:
            print(n1, n2)

# 5,有一个从小到大排好序的列表。现输入一个数,要求按原来的规律将它插入列表中,使用insert
# 如: [2 ,3 ,4 ,56, 67, 98]  如插入63, 100

n = int(input('请输入一个数n'))
list4 = [2, 3, 4, 56, 67, 98]

if n <= list4[0]:
    list4.insert(0, n)

elif n >= list4[-1]:
    list4.insert(len(list4), n)

else:
    for i in range(1, len(list4)):

        if list4[i] <= n <= list4[i + 1]:
            list4.insert(i + 1, n)
            break

print(list4)

# 参考答案  还有其他方法如二分法可以降低循环次数提高效率,这里不说明

list5 = [2, 3, 4, 56, 67, 98]
k = 63
for i, n in enumerate(list5):
    if k < n:
        list5.insert(i, k)
        break
else:
    list5.append(k)

# 6,列表去重, 将下面的列表中重复的元素去除, 不能使用set()
# list1 = [1, 2, 3, 5, 4, 4, 4, 5, 5, 3, 2, 1]
# set的方式:
# list1 = [1, 2, 3, 5, 4, 4, 4, 5, 5, 3, 2, 1]
# print(list(set(list1)))

list1 = [1, 2, 3, 5, 4, 4, 4, 5, 5, 3, 2, 1]

for n in list1:

    while list1.count(n) > 1:
        list1.remove(n)

print(list1)

# 参考答案二  新建列表的方式  建议掌握 此方法 和 集合去重的方法 即可
'''
新建列表的方式
    提高了空间复杂度 python中效率只要不是特别特别慢,一般没关系,它不像其他语言(如C)需要考虑太多的效率问题
        空间复杂度: 消耗内存大小
        时间复杂度: 消耗时间大小
    两者往往是矛盾的,此消彼长,内存小时间大,时间小内存大,很难完全控制都很小
'''
list2 = []
for n in list2:
    if n not in list2:
        list2.append(n)
print(list2)

# 参考答案三  
i = 0
while i < len(list1):               # 建议使用i 每次重新进入循环的时候 会重新取len(list1)的长度值

    j = i + 1
    while j < len(list1):
        if list1[i] == list1[j]:
            list1.pop(j)
            j -= 1              # 这个是为了防止删除的时候删不干净
        j += 1

    i += 1
print(list2)

'''
# 参考答案四   用for 这是错误的
for i in range(len(list1)):
因为这里的range(len(list1))取的是最初表格的长度,是固定的,第一次取得长度之后就固定了
删除元素之后实际的表格长度会变小,在里面再删除一些元素,可能会造成索引错误,越界
所以不建议使用此方式
'''
 

import random
''' 
基础题 之前已经发布过 简单回顾即可
'''

# 1.自定义一个数字列表,获取这个列表中的最小值
ages = [1, -3, 2, 5, -4, 99, 7, 8, 5, 3]

min1 = ages[0]

for n in ages:

    if n < min1:
        min1 = n

print(min1)

# 2. 自定义一个数字列表,元素为10个, 找出列表中最大数连同下标一起输出
ages = [1, -3, 2, 5, -4, 99, 7, 8, 5, 3]

max1 = ages[0]
index1 = 0

for i, n in enumerate(ages):

    if n > max1:
        max1 = n
        index1 = i

print(max1, index1)

# 3. 自定义一个数字列表,求列表中第二大数的下标
ages = [1, -3, 2, 5, -4, 99, 7, 8, 5, 3]
max1 = max(ages)

max2 = ages[0]
index2 = 0

for i, n in enumerate(ages):

    if n == max1:
        continue

    if n > max2:
        max2 = n
        index2 = i

print(max2, index2)

# 4. B哥去参加青年歌手大奖赛 ,有10个评委打分 ,(去掉一个最高分一个最低分)求平均分
scores = [33, 44, 88, 88, 33, 66, 77, 88, 44, 55]
# sum,max,min,len  可以用也可以做不用的
scores.remove(max(scores))
scores.remove(min(scores))
avg = sum(scores) / len(scores)
print(f'平均分为 {avg}')

# 参考答案
avg_scores = (sum(scores) - max(scores) - min(scores)) / (len(scores) - 2)
print(avg_scores)

'''
min1 = scores[0]
max1 = scores[0]
for n in scores:

    if n > max1:
        max1 = n
        scores.remove(max1)

    if n < min1:
        min1 = n
        scores.remove(max1)

s = 0
c = 0
for m in scores:
    s += m
    c += 1
print(f'平均分为 {s/c}')

'''
# 5. 定义列表,存放5个学生的成绩【成绩值自己设定】,获得成绩之和,平均成绩,最小成绩,最大成绩。
scores2 = [66, 77, 88, 99, 100]
sum1 = sum(scores2)
avg1 = sum(scores2) / len(scores2)
min1 = min(scores2)
max1 = max(scores2)
print(f'''
最低分为 {min1}
最高分为 {max1}
总分为 {sum1}
平均分为 {avg1}
''')

# 参考答案
s = sum(scores2)
min1 = min(scores2)
max1 = max(scores2)
avg = s / len(scores2)   # 直接写 avg = s / 5 也可以  题目已经说了5个学生
print(s, max1, min1, avg)

'''
scores = [66, 77, 88, 99, 100]

min1 = scores[0]
max1 = scores[0]

for n in scores:

    if n > max1:
        max1 = n

    if n < min1:
        min1 = n

s = 0
c = 0
for m in scores:
    s += m
    c += 1
    
print(f'最低分为 {min1}')
print(f'最高分为 {max1}')
print(f'总分为 {s}')
print(f'平均分为 {s/c}')

'''

# 6. 将一个列表逆序输出, 提示: range(6,-1,-1), [::-1],reverse
list1 = list(range(6, -1, -1))
# print(list1)
list1.reverse()     # reverse会直接改变原列表,切片不会
print(list1)

# 参考答案
n = [2, 3, 1, 88, -2]
print(n[::-1])  # 推荐使用切片,不会改变原列表

# 参考答案二  麻烦 不推荐
for i in range(4, -1, -1):
    print(n[i])
'''
print(list1[::-1])

'''


# 7.完成猜拳游戏
# 		-----------------------------
# 		请输入你的选择:
# 		1. 石头
# 		2. 剪刀
# 		3. 布
# 		-----------------------------
# 		如: 你的选择是【布】, 电脑的选择是【石头】
# 		恭喜你获得了胜利!
computer = random.randint(1, 3)
print(computer)
print('''
-----------------------------
请输入你的选择(1/2/3):
1. 石头
2. 剪刀
3. 布
-----------------------------
''')
# 石头 > 剪刀
# 剪刀 > 布
# 布 > 石头
me = int(input('输入你的选择:'))

if computer == me:
    print('平局')

elif computer == 1 and me == 3 or computer == 2 and me == 1 or computer == 3 and me == 2:
    print('恭喜你获得了胜利!')

else:
    print('很遗憾,你输了')


# 参考答案:
me = int(input('输入你的选择:'))
print(computer)

if me - computer == -1 or me-computer == 2:
    print('恭喜你获得了胜利!')

elif me == computer:
    print('平局')

else:
    print('很遗憾,你输了')

"""
进阶题:可以使用内置函数
"""

# 1.给定一个列表:将列表中指定的某个元素全部删除: count, remove
list2 = [2, 3, 1, 5, 8, 2, 2, 2, 9, 10]

n = int(input('请输入要删除的元素n'))
for i in range(list2.count(n)):
    list2.remove(n)

print(list2)

# 参考答案
n = [3, 3, 4, 5, 6, 3, 3, 2]
for i in range(n.count(3)):
    n.remove(3)
print(n)

'''
list2 = [2, 3, 1, 5, 8, 2, 2, 2, 9, 10]

n = int(input('请输入要删除的元素n'))
while n in list2:
    list2.remove(n)
    
print(list2)

'''

# 2.自定义一个列表,最大的与第一个元素交换,最小的与最后一个元素交换,输出列表(不考虑特殊情况)
list1 = [2, 3, 4, 5, -6, 7, 8, 1]
# 提示: 要获取最大值和最小值的下标
# 交换列表的元素,要使用下标
# list1[0], list1[2] = list1[2], list1[0]
a = list1.index(max(list1))
b = list1.index(min(list1))
list1[a], list1[0] = list1[0], list1[a]
list1[-1], list1[b] = list1[b], list1[-1]
print(list1)

# 参考答案
# 最大的与第一个元素交换
max_index = list1.index(max(list1))
list1[0], list1[max_index] = list1[max_index], list1[0]
# print(list1)
# 最小的与最后一个元素交换
min_index = list1.index(min(list1))
list1[-1], list1[min_index] = list1[min_index], list1[-1]
# print(list1)

# 3,对称列表. 传入一个列表,元素类型与个数皆未知,返回新列表,由原列表的元素正序反序拼接而成;
# 如传入["One", "Two", "Three"] 返回['One', 'Two', 'Three', 'Three', 'Two', 'One']
list2 = ["One", "Two", "Three"]
list3 = list2.copy()
list3.reverse()
print(list2 + list3)

# 参考答案一样
# 参考答案二 更推荐  必须掌握
print(list2 + list2[::-1])

'''
list2 = ["One", "Two", "Three"]
list3 = list2[:]
list2.extend(list3)
print(list2)
'''

# 4, 给定一个不存在重复元素的整数列表,例如[6 ,4 ,7 ,2 ,5 ,8]和一个数字,例如10,
# 找出两个元素(或同一个元素加自身),并且使这两个数的和为给定数字,并打印出来
# 例如[6 ,4 ,7 ,2 ,5 ,8]和数字10. 打印结果为: 6,4  2,8  5,5

# 提示: 需要使用for循环嵌套
list3 = [6, 4, 7, 2, 5, 8]
n = 10

for i in range(len(list3)):

    for j in range(i, len(list3)):                      # 设置起始值为i 加过的数就不继续加前面的数 避免出现类似4+6、6+4的重复

        # print(list3[i], list3[j], list3[i]+list3[j])
        if list3[i]+list3[j] == n:
            print(list3[i], list3[j])

# 参考答案二--错误写法:  这个方法就遍历更多次,得到的结果有重复 与题干不相符 所以不能使用该方法
list3 = [6, 4, 7, 2, 5, 8]
n = 10

for n1 in list3:

    for n2 in list3:

        if n1 + n2 == n:
            print(n1, n2)

# 参考答案三
list3 = [6, 4, 7, 2, 5, 8]
n = 10

for i, n1 in enumerate(list3):

    for j in range(i, len(list3)):
        n2 = list3[j]
        # print(n1, n2)
        if n1 + n2 == n:
            print(n1, n2)

# 5,有一个从小到大排好序的列表。现输入一个数,要求按原来的规律将它插入列表中,使用insert
# 如: [2 ,3 ,4 ,56, 67, 98]  如插入63, 100

n = int(input('请输入一个数n'))
list4 = [2, 3, 4, 56, 67, 98]

if n <= list4[0]:
    list4.insert(0, n)

elif n >= list4[-1]:
    list4.insert(len(list4), n)

else:
    for i in range(1, len(list4)):

        if list4[i] <= n <= list4[i + 1]:
            list4.insert(i + 1, n)
            break

print(list4)

# 参考答案  还有其他方法如二分法可以降低循环次数提高效率,这里不说明

list5 = [2, 3, 4, 56, 67, 98]
k = 63
for i, n in enumerate(list5):
    if k < n:
        list5.insert(i, k)
        break
else:
    list5.append(k)

# 6,列表去重, 将下面的列表中重复的元素去除, 不能使用set()
# list1 = [1, 2, 3, 5, 4, 4, 4, 5, 5, 3, 2, 1]
# set的方式:
# list1 = [1, 2, 3, 5, 4, 4, 4, 5, 5, 3, 2, 1]
# print(list(set(list1)))

list1 = [1, 2, 3, 5, 4, 4, 4, 5, 5, 3, 2, 1]

for n in list1:

    while list1.count(n) > 1:
        list1.remove(n)

print(list1)

# 参考答案二  新建列表的方式  建议掌握 此方法 和 集合去重的方法 即可
'''
新建列表的方式
    提高了空间复杂度 python中效率只要不是特别特别慢,一般没关系,它不像其他语言(如C)需要考虑太多的效率问题
        空间复杂度: 消耗内存大小
        时间复杂度: 消耗时间大小
    两者往往是矛盾的,此消彼长,内存小时间大,时间小内存大,很难完全控制都很小
'''
list2 = []
for n in list2:
    if n not in list2:
        list2.append(n)
print(list2)

# 参考答案三  
i = 0
while i < len(list1):               # 建议使用i 每次重新进入循环的时候 会重新取len(list1)的长度值

    j = i + 1
    while j < len(list1):
        if list1[i] == list1[j]:
            list1.pop(j)
            j -= 1              # 这个是为了防止删除的时候删不干净
        j += 1

    i += 1
print(list2)

'''
# 参考答案四   用for 这是错误的
for i in range(len(list1)):
因为这里的range(len(list1))取的是最初表格的长度,是固定的,第一次取得长度之后就固定了
删除元素之后实际的表格长度会变小,在里面再删除一些元素,可能会造成索引错误,越界
所以不建议使用此方式
'''

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值