1.找出数组中出现次数最多的元素

方法1:

关于set(),max()及排序用法详见https://blog.csdn.net/guo_qingxia/article/details/103480106Python——用list.sort()和sorted()排序_python list 排序 sorted_nee~的博客-CSDN博客

list = ['1', '2', '3', '6', '5', '6', '6', '2', '1']
result = max(set(list), key=list.count)
print(result)

结果:6

  延伸问题:统计数组中每个元素出现的次数。

List = [1,2,3,4,5,3,2,1,4,5,6,4,2,3,4,6,2,2]
List_set = set(List)
print(List_set)
for item in List_set:
    print("the %d has found %d" % (item, List.count(item)))

结果:

{1, 2, 3, 4, 5, 6}
the 1 has found 2
the 2 has found 5
the 3 has found 3
the 4 has found 4
the 5 has found 2
the 6 has found 2

或者 自己数各个元素出现的次数,然后找到出现次数最多的元素。max求最大值默认情况返回value值(出现次数)最大的key值(元素),而不是value值

appear_times = {}
list = [1,1,2,3,4,5,5,5]
for lable in list:
    if lable in appear_times:
        appear_times[lable] += 1
    else:
        appear_times[lable] = 1
most_common = max(appear_times, key=lambda x: appear_times[x])#或most_common = max(appear_times)
print(appear_times)
print(most_common)

结果:

{1: 2, 2: 1, 3: 1, 4: 1, 5: 3}

方法2:

使用numpy库

np.bincount():计算非负整数数组中每个值的出现次数(统计0~max出现的次数)。语法:numpy.bincount(x, weights=None, minlength=None)。

np.argmax:返回的是最大数的索引

import numpy as np
array = [0,1,2,2,3,4,4,4,5,6]
#np.bincount:首先找到数组最大值max,然后返回0~max的各个数字出现的次数,在上例中,0出现了1次,1出现了1次,2出现了2次...以此类推。np.bincount返回的数组中的下标对应的就是原数组的元素值。
print(np.bincount(array))
#np.argmax:返回数组中最大值对应的下标
print(np.argmax(np.bincount(array)))

结果:

[1 1 2 1 3 1 1]
4

方法3:

Counter用来对数组中元素出现次数进行统计,然后通过most_common函数找到出现次数最多的元素。这种方法对于数组就没有过多限制,甚至是各种类型元素混合的数组也可以。

from collections import Counter
array = [0,1,2,2,3,4,4,4,5,6]
print(Counter(array))
print(Counter(array).most_common(1)[0][0])

结果:

Counter({4: 3, 2: 2, 0: 1, 1: 1, 3: 1, 5: 1, 6: 1})
4

2.约瑟夫生者死者小游戏

 问题描述:

30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。

报数,从 1 开始,数到 9 的人下船。如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?

解决思路:

给30个人编号1-30,每个人的初值都是1(在船上),i代表他们的编号,j代表被扔下船的人数(j=15时循环结束),用check记数,check=9时将对应编号i的人置0(扔下船)并让check重新记数。

当i等于31时,手动将i置为1

当对应编号i的人值为0时,代表此人已经不在船上,i+1找到下一个人记数,以此类推。

代码实现:

people={}
#此处for循环会输出{1: 1, 2: 1, 3: 1, ..., 30: 1},相当于给30个人都赋初始值1
for x in range(1,31):
    people[x]=1
# print(people)
#check记数,0-9;i为人们的编号,1-30;j为下船的人数
check=0
i=1
j=0
while i<=31:
    #因为只有30人,当i等于31时,手动将i置为1
    if i == 31:
        i=1
    #下船15人后退出循环
    elif j == 15:
        break
    else:
        #people[i]为0时,表示此人已下船,i加1,check不增加,继续循环
        if people[i] == 0:
            i+=1
            continue
        else:
            check += 1
            # i=1,check=1,...i=9,check=9
            if check == 9:
                #数到9的人的值设为0(下船),check置0,重新开始计数
                people[i]=0
                check = 0
                print("{}号下船了".format(i))
                #j为下船的人数,下一个人j加1
                j+=1
            else:
                i+=1
                continue

结果:

3.正则表达式练习——用split()制作一个电话簿

 这里有一串电话簿信息,包含姓名、电话号码、房间号、地址。

import re
text = """Ross McFluff: 834.345.1254 155 Elm Street
Ronald Heathmore: 892.345.3428 436 Finley Avenue
Frank Burger: 925.541.7625 662 South Dogwood Way
Heather Albrecht: 548.326.4584 919 Park Place"""
#条目用一个或者多个换行符分开。现在我们将字符串转换为一个列表,每个非空行都有一个条目
entries = re.split("\n+", text)
print(entries)
#最终,将每个条目分割为一个由名字、姓氏、电话号码和地址组成的列表
print("电话本:")
for entry in entries:
    #:? 样式匹配姓后面的冒号,因此它不出现在结果列表中
    ret = re.split(":? ", entry,3)
    print(ret)

结果:

['Ross McFluff: 834.345.1254 155 Elm Street', 'Ronald Heathmore: 892.345.3428 436 Finley Avenue', 'Frank Burger: 925.541.7625 662 South Dogwood Way', 'Heather Albrecht: 548.326.4584 919 Park Place']
电话本:
['Ross', 'McFluff', '834.345.1254', '155 Elm Street']
['Ronald', 'Heathmore', '892.345.3428', '436 Finley Avenue']
['Frank', 'Burger', '925.541.7625', '662 South Dogwood Way']
['Heather', 'Albrecht', '548.326.4584', '919 Park Place']

其他联系可参考re --- 正则表达式操作 — Python 3.11.5 文档

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐