zoukankan      html  css  js  c++  java
  • python随笔(2)

    任意数组,实现一个特定的排序

    题目:

      给定一个无序列表,要求按照奇数在前且正序排列,偶数在后,倒序排列。

      如:[5, 1, 8, 9, 2, 3, 6, 5, 7]。 

      排序之后为:[1, 3, 5, 5, 7, 9, 8, 6, 2]

    解一:第一种思路,可以将题目中的列表,按照奇数、偶数分为两个列表。分别对其就行正序和倒序排列。在将其进行组合。

    # 初始列表
    arr = [5, 1, 8, 9, 2, 3, 6, 5, 7]
    
    # 定义一个偶数列表
    a = []
    # 定义一个奇数列表
    b = []
    for i in arr:
        # 偶数放入a列表中
        if i % 2 == 0:
            a.append(i)
            continue
        # 奇数放入b列表中
        b.append(i)
    
    # 偶数列表倒序排列
    a.sort(reverse=True)
    # 奇数sort默认正序
    b.sort()
    b = b + a
    # [1, 3, 5, 5, 7, 9, 8, 6, 2]
    print(b)

    解二:将列表先倒序排列,然后再遍历,当遇到奇数,将其从列表中取出并插入到第一位。

    # 初始列表
    arr = [5, 1, 8, 9, 2, 3, 6, 5, 7]
    # 倒序排列
    arr.sort(reverse=True) # [9, 8, 7, 6, 5, 5, 3, 2, 1]
    for i in range(len(arr)):
        if arr[i] % 2 != 0:
            # 遇到偶数时,将其从列表中移除(pop),并将其放入第一位
            arr.insert(0, arr.pop(i))
    print(arr)  # [1, 3, 5, 5, 7, 9, 8, 6, 2]

    解三:利用sorted函数和lambda进行自定义排序。当为偶数时,返回比原始列表最大的数还要打的数即可。当为奇数是,返回本身

    arr = [5, 1, 8, 9, 2, 3, 6, 5, 7]
    # [1, 3, 5, 5, 7, 9, 8, 2, 6]
    print(sorted(arr, key=lambda x: x % 2 == 0 and 20 - x or x))
    

    用Python算出100万内的雷劈数

    印度数学家卡普列加(Dattaraya Ramchandra Kaprekar, 1905 - 1986)在一次旅行中,遇到猛烈的暴风雨,他看到路边一块牌子被劈成了两半,一半上写着30,另一半写着25。这时,他忽然发现30+25=55,55^2=3025,把劈成两半的数加起来,再平方,正好是原来的数字。这种数字叫做雷劈数 或者 卡普利加数。(来自百度百科)

    最小的雷劈数为81: 8+1=9   9² = 81

    既然能一分为二说明这个数字的长度肯定是偶数,知道这一点就很方便的能算出100万以内的雷劈数了。

    方式一:

    for i in range(1000000):
        i = str(i)
        # 过滤数字长度不是偶数
        if len(i) % 2 != 0:
            continue
        # a / b分别为两份数据
        a = 0
        b = 0
        # 如果两位数直接截取
        if len(i) == 2:
            a = int(i[0])
            b = int(i[1])
        else:
            # 分片截取
            a = int(i[:int(len(i)/2)])
            b = int(i[int(len(i)/2):])
        # 得出结果
        if (a + b) ** 2 == int(i):
            print(i)

    方式二:

    for i in range(1000000):
        a = len(str(i))
        if a % 2 != 0:
            continue
        else:
            # 通过求整 求余的方式进行截取
            b = 10 ** (a // 2)
            x = int(i / b)
            y = i % b
            if (x + y) ** 2 == i:
                print(i)
    

      

    用Python将字符串进行特殊的转换

    任意给定一个字符串,要求:

    • 将小写的字母转换成大写

    • 将大写的字母转换成小写

    • 将数字转换成9减去这个数的值

    # 方法一
    def transform(string):
        new_str = ''
        for i in string:
            if i.isdigit():
                new_str += str(9 - int(i))
            else:
                new_str += i.swapcase()
        return new_str
    
    
    # 方法二
    def transform2(string):
        new_str = ''
        for i in string:
            if i.isdigit():
                new_str += str(9 - int(i))
            elif i.isupper():
                new_str += i.lower()
            elif i.islower():
                new_str += i.upper()
            else:
                new_str += i
        return new_str
    
    if __name__ == '__main__':
        string = 'ava1241@o3#1-1231;.,,^$d'
        print(transform(string)) # AVA8758@O6#8-8768;.,,^$D
        print(transform2(string)) # AVA8758@O6#8-8768;.,,^$D
    ##########方法一可以写的更pythonic一点############
    string = 'ava1241@o3#1-1231;.,,^$d'
    result = ''.join([str(9 - int(i)) if i.isdigit() else i.swapcase() for i in string])
    print(result)  # AVA8758@O6#8-8768;.,,^$D

    isdigit() : 用于检测字符串是否由纯数字组成,如果只要包含一个非数字就返回False。

    a = '12315'
    print(a.isdigit()) # True
    # 包含字符a
    b = '12345a'
    print(b.isdigit()) # False
    # 包含符号%
    c = '123%15'
    print(c.isdigit()) # False
    

    isalpha() : 检测字符串是否只有字母组成

    a = 'abcd'
    print(a.isalpha()) # True
    b = 'abcd123'
    print(b.isalpha()) # False
    c = 'abc$d'
    print(c.isalpha()) # False
    

    swapcase() : 用于对字符串大小写字母的转换

    a = 'aBcD%Fe'
    print(a.swapcase()) # AbCd%fE
    
    # 将字母全都转换成大写
    print(a.upper()) # ABCDEFG
    # 将字母全都转换成小写
    print(a.lower()) # abcdefg
    
    # 判断是否是大写 False
    print('aaa'.isupper())
    # 判断是否是小写 # True
    print('bbb'.islower())
    

    Python实现删除list中重复元素的几种方式

    通过set方法进行去重

    a = [1, 2, 3, 1, 1, 1, 7, 9, 5]
    print(list(set(a)))

    通过fromkeys方法创建新的字典

    a = [1, 2, 3, 1, 1, 1, 7, 9, 5]
    b = {}
    # fromnkeys 创建一个新的字典,已a中的元素作为字典的键
    b = b.fromkeys(a)
    print(b)  # {1: None, 2: None, 3: None, 7: None, 9: None, 5: None}
    c = list(b.keys())
    print(c)  # [1, 2, 3, 7, 9, 5]

    逻辑判断

    a = [1, 2, 3, 1, 1, 1, 7, 9, 5]
    b = []
    
    for i in a:
        if i not in b:
            b.append(i)
    
    print(b) # [1, 2, 3, 7, 9, 5]
    

    一道关于九宫格的面试题

    有1~9个数字,将他们填入九宫格中(即3*3的表格)。要求他们每行、每列以及对角线的和相等。数字不可以重复。

      思路:

      每行的和相等,而1 + 2 + 3 + .. + 9 = 45。说明每行的和为45/3 = 15。

      所以我们只需要找出所有三位数之和为15的组合。再从里面找出符合要求的。即:9位数不能有重复,且横、纵、斜之和相等的。

    step1:求出所有三位数相加为15的组合

    arr = []
    for i in range(1, 10):
        for j in range(1, 10):
            for m in range(1, 10):
                # 三个数相加等于15,并且三个数不重复,将他们放入列表中
                if i + j + m == 15 and len({i, j, m}) == 3:
                    arr.append([i, j, m])
    
    [
        [1, 5, 9],[1, 6, 8],[1, 8, 6],[1, 9, 5],
        [2, 4, 9],[2, 5, 8],[2, 6, 7],[2, 7, 6],
        [2, 8, 5],[2, 9, 4],[3, 4, 8],[3, 5, 7],
        [3, 7, 5],[3, 8, 4],[4, 2, 9],[4, 3, 8],
        [4, 5, 6],[4, 6, 5],[4, 8, 3],[4, 9, 2],
        [5, 1, 9],[5, 2, 8],[5, 3, 7],[5, 4, 6],
        [5, 6, 4],[5, 7, 3],[5, 8, 2],[5, 9, 1],
        [6, 1, 8],[6, 2, 7],[6, 4, 5],[6, 5, 4],
        [6, 7, 2],[6, 8, 1],[7, 2, 6],[7, 3, 5],
        [7, 5, 3],[7, 6, 2],[8, 1, 6],[8, 2, 5],
        [8, 3, 4],[8, 4, 3],[8, 5, 2],[8, 6, 1],
        [9, 1, 5],[9, 2, 4],[9, 4, 2],[9, 5, 1]
    ]

     step2:遍历这个列表,找出复合条件的

    for a1 in arr:
        for a2 in arr:
            for a3 in arr:
                #  9个元素不重复
                if len(set(a1 + a2 + a3)) == 9:
                    sum1 = a1[0] + a2[0] + a3[0] # 第一列之和
                    sum2 = a1[1] + a2[1] + a3[1] # 第二列之和
                    sum3 = a1[2] + a2[2] + a3[2] # 第三列之和
                    sum4 = a1[0] + a2[1] + a3[2] # 对角线之和
                    sum5 = a1[2] + a2[1] + a3[0] # 对角线之和
                    if sum1 == sum2 == sum3 == sum4 == sum5:
                        print(a1)
                        print(a2)
                        print(a3)
                        print('----------')
    
    [2, 7, 6]
    [9, 5, 1]
    [4, 3, 8]
    ----------
    [2, 9, 4]
    [7, 5, 3]
    [6, 1, 8]
    ----------
    [4, 3, 8]
    [9, 5, 1]
    [2, 7, 6]
    ----------
    [4, 9, 2]
    [3, 5, 7]
    [8, 1, 6]
    ----------
    [6, 1, 8]
    [7, 5, 3]
    [2, 9, 4]
    ----------
    [6, 7, 2]
    [1, 5, 9]
    [8, 3, 4]
    ----------
    [8, 1, 6]
    [3, 5, 7]
    [4, 9, 2]
    ----------
    [8, 3, 4]
    [1, 5, 9]
    [6, 7, 2]
    ----------

    用Python打印乘法口诀表

    难点:口诀表是9行9列的,我们需要注意的是正确的分行、分列.

    Python中的print函数两个参数seq和end。

    • seq:分隔符,默认是空格。

    • end:结束符,默认是换行。

    for i in range(1, 10):
        for j in range(1, i + 1):
            # 输出 i * j , 已	(代表tab健) 结尾
            print('%d * %d = %d' % (i, j, i * j), end='	')
        # 打印空字符,默认结尾换行
        print('')
    

    用Python输出杨辉三角

    杨辉三角,也称作帕斯卡三角。是一个无限堆成的数字金字塔。每一行的数字都是其上方两个数字的和(左上和右上)。

      思路:

      每一行的第一个元素和最后一个元素都为1。

      第n行的第m个元素的值为:它的上一行(n - 1),第 m - 1个元素与第m个元素的和.

    普通方法:

    print("输入需要打印的杨辉三角行数 :", end='' )
    row = int(input())
    if row < 1:
        print('输入有误,请重新输入')
    # 初始化一个杨辉列表
    yh_arr = [[1],[1, 1]]
    if 1 <= row < 3:
        # 分片截取
        yh_arr = yh_arr[: row]
    else:
        # 逐行遍历
        for i in range(2, row):
            # 获取上一行在列表数据
            swap = yh_arr[i - 1]
            # 定义一个列表,第一个元素为1.
            arr = [1]
            # 从第二个元素开始添加值
            for j in range(i - 1):
                # 左上 + 右上
                arr.append(swap[j] + swap[j + 1])
            # 最后一个元素补1
            arr.append(1)
            yh_arr.append(arr)
    
    # 输出
    [print(i) for i in yh_arr]

     补零方法:

    print("输入需要打印的杨辉三角行数 :", end='')
    row = int(input())
    if row < 1:
        print('输入有误,请重新输入')
    # 初始化一个杨辉列表,只存储第一行的元素
    yh_arr = [[1]]
    for i in range(1,row):
        # 在上一行列表后面补 0
        swap = yh_arr[-1]+[0]
        # 初始化一个列表 代表当前行
        arr = [1]
        for j in range(len(swap)-1):
            arr.append(swap[j]+swap[j+1])
        yh_arr.append(arr)
    
    [print(i) for i in yh_arr]
    
  • 相关阅读:
    rocketMQ配置事故
    微信网页授权问题记录
    记一次Spring配置事故
    文件转换
    Java对象空间分配流程
    mysql(六)索引的数据结构
    mysql(五)查询缓存
    mysql(四)log
    从项目中加载文件
    cookie
  • 原文地址:https://www.cnblogs.com/jjb1997/p/11410049.html
Copyright © 2011-2022 走看看