不同的列表创建顺序的不同结果

时间:2018-05-23 12:22:05

标签: python python-3.x list

我将这两个版本放在同一个问题上:"制作一个新列表,其中包含该列表中所有小于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)

4 个答案:

答案 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设置为元素。

在第一个版本中,您将继续附加到上一次迭代。