试图理解Python列表理解顺序和赋值

时间:2015-03-24 19:20:07

标签: python

我想这更像是一个询问而不是一个问题。

花了几个小时来完成一些python示例后,我发现了一些让我质疑Python List Comprehension是如何工作的东西。我相信我对这个概念有所了解。

我知道以下内容是相同的:

ages = [19,15,16,72,43]
for t in range(len(ages)):
   ages[t] = ages[t] + 1

和:

ages = [19,15,16,72,43]
ages = [age +1 for age in ages]

两者都会将年龄改为[20,16,17,73,44],因为列表年龄中的每个项目都被重新命名为等于值++

但是玩弄并测试这个我发现:

>>> agegroups = [[4, 10, 45, 55, 62, 99, 102], \ 
                 [19, 56, 64, 74, 10, 29], \
                 [14, 75, 18, 19, 54, 29,2]]
>>> agegroups = [age.sort() for age in agegroups]
>>> agegroups
[None, None, None]

将年龄组内每个列表的值设置为“无”']

但是使用以下内容将对 agegroups 中的每个列表进行排序。

>>> agegroups = [[4, 10, 45, 55, 62, 99, 102], \ 
                     [19, 56, 64, 74, 10, 29], \
                     [14, 75, 18, 19, 54, 29, 2]]
>>> [age.sort() for age in agegroups]
 [None, None, None]
>>> agegroups
[[4, 10, 45, 55, 62, 99, 102], [10, 19, 29, 56, 64, 74], [2, 14, 18, 19, 29, 54, 75]]

我假设在之前的尝试中,年龄组中的每个列表都被赋予了返回值 age.sort()。我对么 ?

随意敲我,新来的,只是踩到Python线圈。

3 个答案:

答案 0 :(得分:2)

是的,list.sort()的返回值始终为None,列表推导采用列表中每个项目的初始表达式的值。例如,在例如[x for x in list]初始表达式为x,因此x的值将放入结果列表中。在[x.sort() for x in lists]的情况下,初始表达为x.sort(),因此x.sort()(即None)的值会进入结果列表。当然,子列表首先排序。

您可以使用sorted()内置函数将排序后的副本放入列表解析中:

[sorted(x) for x in lists]

或者您可以使用此构造首先调用x.sort(),然后返回x以将已排序的x放入结果列表中:

[x.sort() or x for x in lists]

这是有效的,因为x.sort()总是返回NoneNone是假的,所以or的另一个分支总是被评估并返回值{{1} }。

你可以做的最后一件事就是使用一个生成器表达式并让它由x内置函数使用。

any()

这会对每个子列表进行排序,但不会对any(x.sort() for x in lists) 值执行任何操作 - 它们只会消失。没有创建新列表。 None停在第一个truthy值,并且从来没有任何真值,因为any()总是返回x.sort()这是假的,所以在这种情况下None保证迭代通过整个发电机。 any()会返回any()或(在这种情况下)True,我们也会将其丢弃。因此,您发现False中的每个子列表已排序,lists包含与以前相同的顺序的子列表,因为它没有更改。它基本上与:

相同
lists

答案 1 :(得分:0)

list.sort()是一种自我变异的方法,它不返回任何东西,因此是None。 list.sort()对列表本身进行操作并更改其状态。

如果你想获得每个列表的克隆,你可能会更好地使用sorted(list)

[sorted(age) for age in agegroups]

答案 2 :(得分:0)

列表的排序方法是就地方法,这意味着它不会返回值,但会影响列表的顺序。您应该尝试使用已排序的方法,但它实际上会返回一个值:

[sorted(ages) for ages in agegroups]