Python推导式

本文详细讲解了如何使用Python推导式生成列表、带有条件的列表、与函数结合的复杂推导,以及如何推导字典和集合。涵盖了基础到进阶的实例,包括质数筛选、日期标记、字典排序和去重,是Python初学者和进阶者提升效率的好帮手。
摘要由CSDN通过智能技术生成

推导式:

  • 推导式从一个可枚举数据(列表,元组,集合,字典等)推导出一个列表。也可以推导出生成器,集合或字典。

  • 推导式可以加推导条件,只对符合条件的元素推导

  • 要推导出的元素使用表达式生成,可以用 if else 生成不同元素

推导列表list

1、普通列表生成式

生成1到100之间的数字的平方的列表

nums = [i*i for i in range(1,101)]
print(nums)

'''
输出结果:
[1, 4, 9, 16, ...., 10000]

'''
2、带条件的列表生成式

生成一个列表,包含1到100之间是3的倍数的数字

nums1 = [i*i for i in range(1,101) if i%3==0]
print(nums1)

'''
输出结果:
[9, 36, 81, 144, 225, 324, 441, 576, 729, 900, 1089, 1296, 1521, 1764, 2025, 2304, 2601, 2916, 3249, 3600, 3969, 4356, 4761, 5184, 5625, 6084, 6561, 7056, 7569, 8100, 8649, 9216, 9801]
'''

生成一个列表,如果是3的倍数就用平方,否则就用是数字本身

nums2 = [i*i if i%3==0 else i for i in range(1,101)]
print(nums2)

'''
输出结果:
[1, 2, 9, 4, 5, 36, 7, 8, 81, 10, 11, 144, ....,9216, 97, 98, 9801, 100]
'''
3、列表生成式与函数结合

把推导的条件放在函数中,既可以应对复杂的条件,又可以利用推导式的简洁写法。

推导所有1-100之间的所有质数

如:2,3,5,7…

def is_prime(num):
    if num == 1:
        return False
    for i in range(2,num):
       if (num % i) == 0:
           return False
    else:
       return True

p_nums = [i for i in range(1,100) if is_prime(i)]
print(p_nums)

'''
输出结果:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
'''

同理,如果生成推导结果的过程很复杂,也可以把逻辑放到函数中。

推导1900到2021年之间所有的年份,标记出闰年,生成结果,如:1900, 1901, 1902, 1903, ‘闰1904’

def is_runian(year):
    if (year % 4) == 0:
       if (year % 100) == 0:
           if (year % 400) == 0:
               return True   # 整百年能被400整除的是闰年
           else:
               return False
       else:
           return True       # 非整百年能被4整除的为闰年
    else:
       return False

ryears = [f'闰{y}' if is_runian(y) else y for y in range(1900, 2021)]
print(ryears)

'''
输出结果:
[1900, 1901, 1902, 1903, '闰1904', 1905, 1906, 1907, '闰1908', 1909, 1910, 1911, '闰1912', 1913, 1914, 1915, '闰1916', 1917, 1918, 1919, '闰1920', 1921, 1922, 1923, '闰1924', 1925, 1926, 1927, '闰1928', 1929, 1930, 1931, '闰1932', 1933, 1934, 1935, '闰1936', 1937, 1938, 1939, '闰1940', 1941, 1942, 1943, '闰1944', 1945, 1946, 1947, '闰1948', 1949, 1950, 1951, '闰1952', 1953, 1954, 1955, '闰1956', 1957, 1958, 1959, '闰1960', 1961, 1962, 1963, '闰1964', 1965, 1966, 1967, '闰1968', 1969, 1970, 1971, '闰1972', 1973, 1974, 1975, '闰1976', 1977, 1978, 1979, '闰1980', 1981, 1982, 1983, '闰1984', 1985, 1986, 1987, '闰1988', 1989, 1990, 1991, '闰1992', 1993, 1994, 1995, '闰1996', 1997, 1998, 1999, '闰2000', 2001, 2002, 2003, '闰2004', 2005, 2006, 2007, '闰2008', 2009, 2010, 2011, '闰2012', 2013, 2014, 2015, '闰2016', 2017, 2018, 2019, '闰2020']

'''

推导字典dict

推导字典的方式和推导列表很相似,只不过字典

  • 使用大括号
  • 使用键值对

推导一个包含数字和数字平方组成的字典

{1: 1, 2: 4, 3: 9, ..., 100: 10000}

代码实现:

nums_dict = {n:n*n for n in range(1,101)}
print(nums_dict)

反过来,平方在前面,数字在后面:

{1: 1, 4: 2, 9: 3, ..., 10000:100 }

代码实现:

nums_dict = {n*n:n for n in range(1,101)}
print(nums_dict)

给下面的字典按照分数排序:

{'李四':59, '张三':87, 'bobo':78, '小明':100, '小红':90}

排序结果:

{'小明': 100, '小红': 90, '张三': 87, 'bobo': 78, '李四': 59}

实现思路:

先把字典scores变成一个元组列表:scores.items()
用sorted函数给元组列表排序:sorted(scores.items(), key=lambda item:item[1], reverse=True)
排序过程用lambda指定使用元组的第二列排序:key=lambda item:item[1]。默认是是第一列。
指定倒着排序,也就是分数高的在前面:reverse=True
使用推导式,把排好序的元组列表,生成一个新的排好序的字典:{item[0]:item[1] for item in ... }

代码:

scores = {'李四':59, '张三':87, 'bobo':78, '小明':100, '小红':90}
sored_scores = {item[0]:item[1] for item in sorted(scores.items(), key=lambda item:item[1], reverse=True)}
print(sored_scores) 

推导集合set

推导集合的方式和列表是一样的,区别在于:

  1. 使用大括号,类似于推导字典,但它是单个元素,而不是键值对。
  2. 集合会自动过滤掉重复的元素。

下面的名字列表,去掉前后空格后去掉重复的名字:

[ '李四', '张三', ' 李四 ', 'bobo ', '张小三', 'bobo', '小明',' 小红','小红' ]

代码:

names = [ '李四', '张三', ' 李四 ', 'bobo ', '张小三', 'bobo', '小明',' 小红','小红' ]
new_names = {n.strip() for n in names}
print(new_names)

推导结果:

{'小明', 'bobo', '张小三', '小红', '张三', '李四'}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值