我将这两个版本放在同一个问题上:"制作一个新列表,其中包含该列表中所有小于5的元素并打印出这个新列表。"它们是相同的但只是行" new_a = []" 的顺序不同,它们提供不同的结果。怎么会?提前致谢!
#Ver1
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
new_a = []
for element in a:
if element < 5:
new_a.append(element)
print(new_a)
#Ver2
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
for element in a:
if element < 5:
new_a = []
new_a.append(element)
print(new_a)
答案 0 :(得分:3)
您的第二个版本每次遇到小于new_a
的元素时都会创建一个新的空5
列表,从而有效地删除所有以前的条目。更有效的方法是使用列表理解
>>> [i for i in a if i < 5]
[1, 1, 2, 3]
答案 1 :(得分:2)
在#1中,您定义了一个结果列表,然后依次附加到它。
在#2中,您为每个循环定义一个新的空列表。
这样做的结果是第二个解决方案不存储try {
accessToken = restTemplate.getAccessToken();
}
catch (UserRedirectRequiredException e) {
Map<String, String> requestParams = e.getRequestParams();
requestParams.put("response_type", "token");
throw e; //don't forget to rethrow
}
循环先前迭代的结果。
有几种方法可以让您的代码更具可读性:
生成器功能
定义生成器函数并删除样板列表创建代码。
for
<强>悟强>
你可以使这个懒惰并迭代生成器理解:
def custom_filter(lst, i):
for element in lst:
if element < i:
yield element
res = list(custom_filter(a, 5))
或者你可以使用列表理解:
res = (i for i in a if i < 5)
答案 2 :(得分:0)
在第二个版本中,当您在循环中定义new_a = []
时,它会在每次迭代中创建新的空列表。并且值将更新到新列表,如下所示:
[1]
[1]
[2]
[3]
在您的第一个版本中,如果您想要输出[1, 1, 2, 3]
,则需要在print(new_a)
之前删除缩进,如下所示:
a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
new_a = []
for element in a:
if element < 5:
new_a.append(element)
print(new_a)
答案 3 :(得分:0)
在第二个版本中,您在每次迭代中都设置了列表new_a = []
。您将其设置为[]
,然后将append
设置为元素。
在第一个版本中,您将继续附加到上一次迭代。