【问题标题】:Python List Slicing with None as argument以 None 为参数的 Python 列表切片
【发布时间】:2015-08-17 19:45:34
【问题描述】:

通过反复试验我发现

my_list = range(10)
my_list[:None] == my_list[:]

我将它用于 django 查询集,因此我可以定义大小或全部获取:

some_queryset[:length if length else None]

# @IanAuld
some_queryset[:length or None]


# @Bakuriu
# length works for all numbers and None if you want all elements
# does not work with False of any other False values
some_queryset[:length]
  • 在切片时使用None 是一种好习惯吗?
  • 这种方法在任何情况下都会出现问题吗?

【问题讨论】:

  • 如果length = 0(要求一个长度为0的查询集),你会得到一个相当意想不到的结果。
  • 顺便说一句,即使my_list[None:None] == my_list[:]True
  • @IanAuld 是的,我知道 ;-) 但我认为说空列表没有用例是省事。
  • 请使用length 而不是lenght
  • @yamm 只要您确定0 永远不会成为length 的可接受值,那么它应该可以正常工作。虽然可以缩短为lst[:length or None]

标签: python list slice nonetype


【解决方案1】:

是的,可以使用None,因为它的行为由documentation 指定:

从 i 到 j 的 s 切片定义为索引为 k 的项目序列,使得 i 如果 j 被省略或 None,使用 len(s)。如果 i 大于或等于 j,则切片为空。

None 用于切片参数之一与省略它相同。

【讨论】:

  • 同时注意指定无效切片索引时的错误信息:TypeError: slice indices must be integers or None or have an __index__ method
【解决方案2】:

你的方式很好,但我会更喜欢

some_queryset[:length] if length else some_queryset

some_queryset[:length] if length else some_queryset[:]

在切片如何处理这些特殊情况的知识较少的情况下可读。

【讨论】:

  • 也可以写成length and some_queryset[:length] or some_queryset
【解决方案3】:

应该是安全的。在 Python 中,something[<sliceexpr>] 等价于 something[slice(...)]slice 类型的文档清楚地表明 stop 和 step 的参数默认为 None

【讨论】:

    【解决方案4】:

    使用None 或使用像[:] 这样的空切片没有区别,但是当您想在列表理解中使用它或在切片条件下使用它时,使用None 很有用,例如:

    >>> [my_list[:length if length%2==0 else None] for length in [1,2,3]]
    [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
    

    来自CPython 中的评论源about slice function

    返回具有给定值的新切片对象。 开始stopstep 参数作为切片对象同名属性的值。任何值都可以是 NULL,在这种情况下,None 将用于相应的属性。如果新对象不能返回 NULL 被分配。

    【讨论】:

      【解决方案5】:

      正如@kasravnd 的回答所描述的,使用 None 与未在切片运算符中指定任何内容相同(即,它意味着 all),但如果您想有条件地指定索引或 所有。

      不过,None 还有另一种用法,但它仅适用于 Numpy 和 Pytorch:您可以在切片运算符中使用 None 来为数组添加额外的维度。

      import numpy as np
      
      abc=np.array([1,2,3])
      print(abc[:,None])
      

      打印出来:

      array([[1],
             [2],
             [3]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-21
        • 1970-01-01
        • 2017-06-24
        • 2015-02-19
        • 2014-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多