我想这更像是一个询问而不是一个问题。
花了几个小时来完成一些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线圈。
答案 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()
总是返回None
,None
是假的,所以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]