【python代码之美】人生苦短,我用python

文章介绍了两个Python程序,第一个使用深度优先搜索算法在给定的字符地图中寻找特定单词,第二个程序则按照特定规则对奥运会奖牌榜进行排序。这两个示例展示了Python在处理问题解决和数据排序方面的效率和灵活性。
摘要由CSDN通过智能技术生成

人生苦短,我用python

1.迷宫问题

代码解读

这段代码实现了在给定的地图中查找指定单词的功能。代码首先读取输入的地图和待查找的单词,然后遍历地图中的每个位置,如果当前位置的字母是待查找单词的第一个字母,就从当前位置开始查找。查找过程使用了深度优先搜索算法,递归地查找当前位置的上下左右四个位置,直到找到单词的最后一个字母或者无法继续查找为止。如果找到了待查找的单词,输出YES并返回;如果遍历完整个地图都没有找到待查找的单词,输出NO。

具体来说,代码中的函数dfs实现了深度优先搜索算法。该函数接受五个参数:board表示地图,r和c表示待查找位置的行索引和列索引,word表示待查找的单词,index表示查到的单词索引,每次增加一。函数首先判断是否已经查找到了单词的最后一个字母,如果是则返回True;然后判断当前位置是否在地图范围内,或者当前位置的字母是否为待查找的字母,如果不是则返回False;接着将当前位置标记为已访问,然后递归查找当前位置的上下左右四个位置,如果其中任意一个位置能够找到待查找的下一个字母,则返回True;最后将当前位置标记为未访问,然后返回结果。

在主函数func中,代码遍历地图中的每个位置,如果当前位置的字母是待查找单词的第一个字母,就从当前位置开始调用dfs函数查找。如果找到了待查找的单词,输出YES并返回;如果遍历完整个地图都没有找到待查找的单词,输出NO。

def func():
    # 读取输入的第一行,分别为行数和列数
    line1 = input().split()
    n = int(line1[0])  # 行
    m = int(line1[1])  # 列
    # 读取输入的第二行,为待查找的单词
    word = input()
    # 读取输入的接下来n行,为地图
    board = []
    for _ in range(n):  # _表示不在意变量的值,是一个占位符
        board.append(list(input()))

    def dfs(board, r, c, word, index):
        '''board:地图
        r:待查找位置的行索引
        c:待查找位置的列索引
        word:待查找的单词
        index:查到的单词索引,每次增加一'''
        # 如果已经查找到了单词的最后一个字母,返回True
        if index == len(word):
            return True
        # 如果当前位置不在地图范围内,或者当前位置的字母不是待查找的字母,返回False
        if (r < 0 or r >= n) or (c < 0 or c >= m) or (board[r][c] != word[index]):
            return False
        # 将当前位置标记为已访问
        board[r][c] = '*'
        # 递归查找当前位置的上下左右四个位置
        result = dfs(board, r + 1, c, word, index + 1) \
            or dfs(board, r - 1, c, word, index + 1) \
            or dfs(board, r, c + 1, word, index + 1) \
            or dfs(board, r, c - 1, word, index + 1)
        # 将当前位置标记为未访问
        board[r][c] = word[index]
        return result

    # 遍历地图中的每个位置,如果当前位置的字母是待查找单词的第一个字母,就从当前位置开始查找
    for r in range(n):
        for c in range(m):
            if board[r][c] == word[0]:
                if dfs(board, r, c, word, 0):
                    # 如果找到了待查找的单词,输出YES并返回
                    print('YES')
                    return
    # 如果遍历完整个地图都没有找到待查找的单词,输出NO
    print('NO')


if __name__ == "__main__":
    func()

输出结果:

在这里插入图片描述

2.奥运会奖牌榜

1、首先gold medal数量多的排在前面;
2、其次silver medal数量多的排在前面;
3、然后bronze medal数量多的排在前面;
4、若以上三个条件仍无法区分名次,则以国家名称的字典序排定
我们假设国家名称不超过20个字符、各种奖牌数不超过100,且大于等于0.

输入:

第一行输入一个整数N(0<N<21),代表国家数量;
然后接下来的N,每行包含一个字符串Namei表示每个国家的名称,和三个整数Gi、Si、Bi表示每个获得的gold medal、silver medal、bronze medal的数量,以空格隔开,如(China 51 20 21)

输出:

输出奖牌榜的依次顺序,只输出国家名称,各占一行。

python代码1:

代码解读:

这段代码定义了一个名为func的函数,该函数实现了对输入的元组进行排序并输出排序后的元组的第一个元素。具体来说,该函数首先创建了一个空列表arr,用于存储输入的元组。然后,该函数通过input()函数获取一个整数n,表示接下来将输入n个元组。接着,该函数通过for循环n次,每次输入一个元组,并将该元组转换为一个包含四个元素的元组,其中第一个元素为字符串类型,后三个元素为整数类型。将转换后的元组添加到arr列表中。接下来,该函数对arr列表进行排序,排序规则为:按照第二个元素降序排列,如果第二个元素相同,则按照第三个元素降序排列,如果第三个元素相同,则按照第四个元素降序排列,如果第四个元素相同,则按照第一个元素升序排列。最后,该函数通过for循环n次,每次输出一个元组的第一个元素。

def func():
    arr =[]  # 创建一个空列表,用于存储输入的元组
    n = int(input())  # 输入一个整数n,表示元组的数量
    for i in range(n):  # 循环n次,每次输入一个元组
        list1 =input().strip().split()  # 输入一个字符串,去除首尾空格并按空格分割,得到一个列表
        arr.append((list1[0],int(list1[1]),int(list1[2]),int(list1[3])))  # 将列表中的四个元素分别转换为字符串、整数、整数、整数,并作为一个元组添加到arr列表中
    arr.sort(key=lambda x:(-int(x[1]),-int(x[2]),-int(x[3]),x[0]))  # 对arr列表进行排序,排序规则为:按照第二个元素降序排列,如果第二个元素相同,则按照第三个元素降序排列,如果第三个元素相同,则按照第四个元素降序排列,如果第四个元素相同,则按照第一个元素升序排列
    for i in range(0,n):  # 循环n次,每次输出一个元组的第一个元素
        print(arr[i][0])

if __name__=="__main__":
    func()

输出结果:

在这里插入图片描述

这段代码是比较让人有惊喜的,短短的11行代码实现了丰富的功能,足以见得python代码的强大。

python代码2:

def func():
    result1 =[] # 定义一个空列表,用于存储排序后的结果
    n = int(input()) # 输入一个整数n,表示接下来有n行输入
    numlist = [[0]*4 for i in range(n)] # 定义一个n行4列的二维列表,用于存储输入的数据
    for i in range(0,n):
        numlist[i] =str(input()).split() # 输入一行字符串,将其按空格分割后存入numlist中的第i行
    result1 = sorted(numlist,key=lambda x:(-int(x[1]),-int(x[2]),-int(x[3]),x[0])) # 对numlist进行排序,排序规则为:第二列降序,第三列降序,第四列降序,第一列升序
    for i in range(0,n):
        print(result1[i][0]) # 输出排序后的结果中的第一列

if __name__=="__main__":
    func()
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑着的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值