当前位置: 首页 > 面试题库 >

将带有赋值的循环转换为理解力

夹谷和韵
2023-03-14
问题内容

将循环转换为理解很简单:

mylist = []
for word in ['Hello', 'world']:
    mylist.append(word.split('l')[0])

mylist = [word.split('l')[0] for word in ['Hello', 'world']]

但是,我不确定在循环涉及为引用分配值时如何进行。

mylist = []
for word in ['Hello', 'world']:
    split_word = word.split('l')
    mylist.append(split_word[0]+split_word[1])

并且理解最终看起来像这样:

mylist = [word.split('l')[0]+word.split('l')[1] for word in ['Hello', 'world']]

这将计算word.split('l')多次,而循环仅计算一次并保存一个引用。我尝试了以下方法:

mylist = [split_word[0]+split_word[1] for word in ['Hello', 'world'] with word.split('l') as split_word]

失败的原因with是无法正常工作,并且:

mylist = [split_word[0]+split_word[1] for word in ['Hello', 'world'] for split_word = word.split('l')]

这也不起作用。我知道可以通过*和打开包装,**但不确定在哪里放置。是否有可能以一种整洁的方式将这种循环变成理解?


问题答案:

您不能直接将该循环转换为理解力。理解是表达式,只能包含表达式,赋值是语句。

但是,这并不意味着没有选择。

首先,split您只需拨打两次电话即可:

mylist = [word.split('l')[0]+word.split('l')[1] for word in ['Hello', 'world']]

但是您不想打split两次电话。

解决该问题的最通用方法是使用一连串生成器表达式(末尾具有一个列表理解)来转换事物:

words = (word.split('l') for word in ['Hello', 'world'])
mylist = [w[0]+w[1] for w in words]

如果您真的想将所有内容合并为一个表达式,则可以:

mylist = [w[0]+w[1] for w in 
          (word.split('l') for word in ['Hello', 'world'])]

但是除非您实际上 需要 将其包含在表达式中,否则不这样做可能更易读。

在这种情况下,一种更具体的方式是w[0]+w[1]用不需要w两次引用的等效项替换:

mylist = [''.join(word.split('l')[:2]) for word in ['Hello', 'world']]

您也可以一概而论。您可以将 任何
表达式转换为函数,这意味着可以通过将表达式作为参数传递给该函数来避免对表达式的任何部分求值。如果没有一个函数可以满足您的要求,请编写该函数:

def join_up(split_word):
    return split_word[0]+split_word[1]
mylist = [join_up(word.split('l')) for word in ['Hello', 'world']]

如果您需要在不重复任何工作的情况下将所有内容整合到一个表达式中,则可能会很麻烦:

mylist = [(lambda split_word: split_word[0]+split_word[1])(word.split('l')) 
          for word in ['Hello', 'world']]

但是最终,除非我已经有了一个可以满足我需要的函数,否则我将使用发电机链表达式解决方案。

或者,当然,只需将其保持在明确的循环中即可;for循环没有什么问题,而且如果中间临时变量使您的代码更清晰,那么没有比使用赋值语句更好的方法了。



 类似资料:
  • 问题内容: 我正在尝试将此for循环重写为for每个循环。 这就是我尝试过的 谁能指出我正确的方向?谢谢。 问题答案: 我认为您想得太多… :)

  • 将循环转换为时遇到问题。 方法返回 我尝试过,但需要等待将转换为并且我无法添加它。 我正在尝试下载大约15个报告异步,以等待所有的已经下载,然后将它们合并成一个PDF。 注意:我使用的是框架4.8.3

  • 我需要将这段包含多个for循环和if语句的代码转换为Java 8流: 我需要循环遍历一个数组的名称,并返回一个仅包含不重复的名称的列表。如果一个名字出现不止一次,我需要将它从最终列表中删除。 输入->[“Tom”,“George”,“Tom”,“Mike”,“Brian”] 输出->[“George”,“Mike”,“Brian”] 有谁能帮忙吗?

  • 我尝试将一个循环转换为一个循环在flutter中等待循环。我想要循环的元素是Firebase实时数据库中的快照。 我的函数如下所示: 我尝试了不同的方法,但是我没有让函数工作。 第一次尝试: 错误: 未处理的异常:键入'_InternalLinkedHashMap 第二次尝试: 错误: 未处理的异常:键入'_InternalLinkedHashMap 在所有的尝试中,我都得到了相同的错误。但是上述

  • 问题内容: 当我编写如下while循环时,在eclipse中使用Java时,我已经无数次朋克: 实际上,我想要 这是一个非常简单的错误,但是它在我身上经常发生,并且完全使该程序无效。这样做的原因是因为当我编写与等式相反的赋值时,Eclipse甚至没有引发警告。这使我相信必须要有一个存在赋值方程的while循环的原因,但是为什么呢?我想不出一次用! 问题答案: 这样的赋值在C和C ++中很流行(尤其

  • 我已经了解了一些关于流的知识,并且知道它们可以用来代替循环。对于这个玩具示例,我使用一个图形数据库来存储一组字符串。数据库将它们存储为顶点。我想检索这些顶点,并将它们转换为字符串,而是使用流。每个顶点都有一组性质;我给它一个键,它返回一个值。如果一个顶点具有我正在寻找的属性,我将它添加到列表中。如果没有,我存储顶点ID。 我有一个for循环,但我不确定如何使用流来代替。代码如下: