当前位置: 首页 > 后端技术 > Python

如何使用Python列表理解公式?

时间:2023-03-26 13:57:47 Python

Python是一种极其多样化且功能强大的编程语言!在解决问题时,它有不同的方法。在本文中,列表理解将被展示。我们将讨论如何使用它?什么时候应该或不应该使用它?列表理解的优点是可以节省循环的时间和空间。需要更少的代码行。迭代语句可以转换为公式。如何在Python中创建列表列表理解是一种用于从现有列表创建列表的语法结构。让我们看看创建列表的不同实现方式循环循环是创建列表的传统方式。使用什么循环并不重要。要以这种方式创建列表,您应该:实例化一个空列表。遍历可迭代的元素(例如范围)。将每个元素附加到列表的末尾。numbers=[]fornumberinrange(10):numbers.append(number)print(numbers)输出:[1,2,3,4,5,6,7,8,9,10]在这个例子中,你实例化一个空列表数字。然后使用for循环迭代range(10)并使用append()方法将每个数字附加到列表的末尾。map()objectmap()是另一种创建列表的方法。您需要向map()传递一个函数和一个可迭代对象,然后它创建一个对象。该对象包含通过使用指定函数执行每个迭代元素获得的输出。例如,我们将展示在某些产品的价格中添加增值税的任务。VAT_PERCENT=0.1#10%defadd_vat(price):返回价格+(price*VAT_PERCENT)prices=[10.03,8.6,32.85,41.5,22.64]grand_prices=map(add_vat,prices)print(grand_prices)grand_prices=list(grand_prices)print(grand_prices)您已经构建了add_vat()函数并创建了可迭代的价格。您将两个参数都传递给map()并收集生成的地图对象grand_prices,或者您可以使用list()轻松地将其转换为列表。Output:#map(add_vat,prices)[11.03,9.46,36.14,45.65,24.9]#list(grand_prices)列表理解现在,让我们看看列表理解方法!这确实是Pythonic,也是创建列表的更好方法。为了看看这种方法有多强大,让我们用一行代码重写循环示例。numbers=[numberfornumberinrange(10)]print(numbers)输出[1,2,3,4,5,6,7,8,9,10]如你所见,这是一个神奇的方法!列表推导式看起来可读性很强,你不需要写更多的代码,一行就够了。为了更好地理解列表,请查看以下语法:new_list=[expressionformemberiniterable]哪种方法更有效?好吧,我们已经学习了如何使用循环、map()和列表理解来创建列表。在“哪种方法效果更好”这个问题可能正在你的脑海中盘旋。我们来分析一下!importrandomimporttimeitVAT_PERCENT=0.1PRICES=[random.randrange(100)forxinrange(100000)]defadd_vat(price):返回价格+(price*VAT_PERCENT)defget_grand_prices_with_map():returnlist(map(add_vat,PRICES))defget_grand_prices_with_comprehension():return[add_vat(price)forpriceinPRICES]defget_grand_prices_with_loop():grand_prices=[]forpriceinPRICES:grand_prices.append(add_vat(price))returngrand_pricesprint(timeit_w_timeit(number=100))print(timeit.timeit(add_grand_prices_with_comprehension,number=100))print(timeit.timeit(get_grand_prices_with_with_loop,number=100))输出:0.9833468980004909#with_map1.19722372999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999.COM9999999999999.COM9999999.COMY太体创建列表的方法是map(),然后是列表理解,最后是循环。但是,方法的选择应取决于您要实现的目标。使用map()可以让你的代码更有效率。使用循环可以让代码的思路更加清晰。使用列表理解可以让你的代码更紧凑和高效。这是创建列表的最佳方式,因为它最易读。高级解析条件逻辑早些时候,我向您展示了这个公式:new_list=[expressionformemberiniterable]这个公式可能有些不完整。更完整的解析器描述增加了对可选条件的支持。向列表理解添加条件逻辑的最常见方法是在表达式末尾添加条件:new_list=[expressionformemberiniterable(ifconditional)]在这里,您的条件语句放在括号中。条件很重要,因为它们允许列表理解过滤掉不需要的值,通常也可以调用filter():numbers=[numberfornumberinrange(20)ifnumber%2==0]print(numbers)output:[0,2,4,6,8,10,12,14,16,18]如您所见,此解析收集可被2整除且无余数的数字。如果您需要更复杂的过滤器,那么您甚至可以将条件逻辑移动到一个单独的函数中。defis_prime(number):如果number>1:forelinrange(2,int(number/2)+1):if(number%el)==0:returnFalseelse:returnTruenumbers=[numberfornumberinrange(20)ifis_prime(number)]print(numbers)outputs:[2,3,5,7,11,13,17,19]你构建is_prime(number)来判断一个数是否为质数并返回一个布尔值。接下来,您应该将函数添加到分析条件。此公式允许您使用条件逻辑从多个可能的输出选项中进行选择。例如,你有一个产品价格表,如果有负数,你应该将它们转换为正数:price_list=[1.34,19.01,-4.2,6,8.78,-1,1]normalized_price_list=[priceifprice>0elseprice*-1forpriceinprice_list]print(normalized_price_list)output:[1.34,19.01,4.2,6,8.78,1,1]这里,你的表达式price有一个条件语句ifprice>0elseprice*-1.这告诉Python如果价格为正则输出价格值,但如果价格为负则将价格转换为正值。这很强大,将条件逻辑视为其自身的函数确实很有用:defnormalize_price(price):returnpriceifprice>0elseprice*-1price_list=[1.34,19.01,-4.2,6,8.78,-1,1]normalized_price_list=[normalize_price(price)forpriceinprice_list]print(normalized_price_list)output:[1.34,19.01,4.2,6,8.78,1,1]setanalysisformula您还可以创建一个setanalysisMode!它与列表推导式基本相同。不同之处在于设置的决议不包含重复项。您可以使用大括号而不是方括号来创建集合解析:string="Excellent"unique_string={letterforletterinstring}print(unique_string)output:{"E","e","n","t","x","c","l"}您的设置解析器仅包含唯一字母。这与列表不同,集合不保证项目将以特定顺序存储数据。这就是为什么集合输出的第二个字母是e,即使字符串中的第二个字母是x。字典分析类似,但需要定义一个键:string="Wordsarebutwind"word_order={el:ind+1forind,elinenumerate(string.split())}print(word_order)output:{"Words":1,"are":2,"but":3,"wind":4}要创建词序字典,请使用花括号({})和键值对(el:ind+1)。海象运算符Python3.8中引入的海象运算符允许您同时解决两个问题:为变量赋值并返回该值。假设您需要向将返回温度数据的API应用十次。您想要的只是华氏100度以上的结果。并且每个请求可能返回不同的数据。在这种情况下,无法使用Python中的列表理解来解决问题。可迭代成员的公式表达式(如果有条件)不能让条件将数据分配给表达式可访问的变量。海象运算符解决了这个问题。它允许您在执行表达式时将输出值分配给变量。以下示例显示了如何使用get_weather_data()生成虚假天气数据:get_weather_data())>=100]print(hot_temps)output:[108,100,106,103,108,106,103,104,109,106]不使用推导列表推导的时候非常有用,它可以帮助你编写干净、易于阅读和调试的代码。但在某些情况下,它们可能会使您的代码运行速度变慢或使用更多内存。如果它使您的代码效率降低或更难理解,请考虑采用其他方式。请注意,嵌套解析可以嵌套以创建列表、字典和集合的组合集合。例如,假设一家公司在一年中跟踪五个不同城市的收入。存储此数据的完美数据结构是嵌套在字典推导中的列表推导。cities=['NewYork','Oklahoma','Toronto','LosAngeles','Miami']budgets={city:[0forxinrange(12)]forcityincities}print(budgets)输出:{“纽约”:[0,0,0,0,0,0,0,0,0,0,0,0],“俄克拉荷马”:[0,0,0,0,0,0,0,0,0,0,0,0],"多伦多":[0,0,0,0,0,0,0,0,0,0,0,0],"洛杉矶":[0,0,0,0,0,0,0,0,0,0,0,0],"迈阿密":[0,0,0,0,0,0,0,0,0,0,0,0]}您使用字典理解创建了预算容器。该表达式是一个包含另一个分析表达式的键值对。这段代码会快速生成城市中每个城市的数据列表。嵌套列表是创建矩阵的常用方法,通常用于数学目的。查看下面的代码块:matrix=[[xforxinrange(7)]foryinrange(6)]print(matrix)outputs:[[0,1,2,3,4,5,6],[0,1,2,3,4,5,6],[0,1,2,3,4,5,6],[0,1,2,3,4,5,6],[0,1,2,3,4,5,6],[0,1,2,3,4,5,6]]外部列表理解[...foryinrange(6)]创建六行,而内部列表理解[xforxinrange(7)]将用值填充这些行中的每一行。到目前为止,每个嵌套解析器的目标都是真实而直观的。但是,在其他情况下,例如创建扁平化嵌套列表,逻辑会使您的代码很难阅读。让我们看下面的例子,使用嵌套列表理解来展平矩阵:matrix=[[0,1,0],[1,0,1],[2,1,2],]flat=[numforrowinmatrixfornuminrow]print(flat)output:[0,1,0,1,0,1,2,1,2]矩阵展平的代码确实很简洁,但是太难懂了.您应该花一些时间弄清楚它是如何工作的。另一方面,如果您使用for循环来展平同一个矩阵,您的代码将更加简单和可读:matrix=[[0,1,0],[1,0,1],[2,1,2],]flat=[]forrowinmatrix:fornuminrow:flat.append(num)print(flat)输出:[0,1,0,1,0,1,2,1,2]现在,您可以看到代码一次遍历矩阵一行,在移动到下一行之前获取该行中的所有元素。虽然嵌套列表理解可能看起来更像Pythonic,但更重要的是能够编写您的团队可以轻松理解和修改的代码。选择方法时,您应该根据解析是否有助于或损害可读性来判断调用。对大型数据集使用生成器Python中的列表理解通过将整个列表存储在内存中来工作。这通常适用于中小型列表。如果你想对前一千个整数求和,列表推导将很容易解决这个任务:数字?您可以尝试此操作,但您的计算机可能没有响应。这是可能的,因为在计算机中分配了大量内存。也许你是因为你的电脑没有那么多的内存资源。例如,您想要一些前10亿个整数,那么让我们使用生成器吧!这可能需要更多时间,但计算机应该可以克服它:summary=sum((xforxinrange(1000000000)))print(summary)output:499999999500000000让我们比较一下哪种方法更好!importtimeitdefget_sum_with_map():returnsum(map(lambdax:x,range(1000000000)))defget_sum_with_generator():returnsum((xforxinrange(1000000000)))print(timeit.timeit(get_sum_with_map,number=100))print(timeit.timeit(get_sum_with_generator,number=100))Output:4940.844053814#get_sum_with_map3464.1995523349997#get_sum_with_generator如您所见,生成器比map()更高效。总结本文向您介绍了列表解析式以及如何使用它们来解决复杂的任务而不会使您的代码变得太困难。现在您:学习了几种创建列表的替代方法。找出每种方法的优点。可以简化循环和map()调用的列表理解。了解一种向解析器添加条件逻辑的方法。可以创建集合和字典推导式。了解何时不使用解析表达式。