推导式:
-
推导式从一个可枚举数据(列表,元组,集合,字典等)推导出一个列表。也可以推导出生成器,集合或字典。
-
推导式可以加推导条件,只对符合条件的元素推导
-
要推导出的元素使用表达式生成,可以用 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
推导集合的方式和列表是一样的,区别在于:
- 使用大括号,类似于推导字典,但它是单个元素,而不是键值对。
- 集合会自动过滤掉重复的元素。
下面的名字列表,去掉前后空格后去掉重复的名字:
[ '李四', '张三', ' 李四 ', 'bobo ', '张小三', 'bobo', '小明',' 小红','小红' ]
代码:
names = [ '李四', '张三', ' 李四 ', 'bobo ', '张小三', 'bobo', '小明',' 小红','小红' ]
new_names = {n.strip() for n in names}
print(new_names)
推导结果:
{'小明', 'bobo', '张小三', '小红', '张三', '李四'}