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

2024-05-04 12:51:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想这与其说是一个问题,不如说是一个询问。你知道吗

在花了几个小时研究了一些python示例之后,我发现了一些让我质疑python列表理解如何工作的东西。我相信我已经掌握了这个概念。你知道吗

我知道以下是一样的:

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],因为列表中的每个项目年龄都将改为等于value++

但在玩游戏和测试时我发现:

>>> 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 = [[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]]

我假设在前面的尝试中,agegroups中的每个列表都被分配了返回值年龄.排序()。我说的对吗?你知道吗

请随意打我,新的在这里,只是踏入Python线圈。你知道吗


Tags: innone概念示例列表forage排序
3条回答

是的,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是false,所以or的另一个分支总是被求值并返回值x。你知道吗

您可以做的最后一件事是只使用生成器表达式并让它被any()内置函数使用。你知道吗

any(x.sort() for x in lists)

这会对每个子列表进行排序,但不会对它们消失的None值做任何处理。未创建新列表。any()在第一个truthy值处停止,并且从不存在任何truthy值,因为x.sort()总是返回None,这是错误的,因此在这种情况下any()保证遍历整个生成器。any()返回True或(在本例中)False,我们也将其丢弃。因此您会发现lists中的每个子列表都已排序,lists包含子列表的顺序与之前相同,因为它没有更改。基本上与以下内容相同:

for x in lists: x.sort()

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

[sorted(ages) for ages in agegroups]

你知道吗列表.排序()是一个自变异方法,它不返回任何内容,因此不返回任何内容。列表.排序()对列表本身进行操作并更改其状态。你知道吗

如果您想获得每个列表的克隆,最好使用sorted(list)

[sorted(age) for age in agegroups]

相关问题 更多 >