python远足 - tuple取第一个




为什么Python从结尾索引列表时从索引-1开始(而不是0)? (5)

为了以另一种方式解释它,因为 -0 等于 0 ,如果从 0 开始向后,则它对于解释器是不明确的。

如果你对 - 感到困惑 - 并且寻找另一种向后索引的方式更容易理解,你可以尝试 ~ ,它是前进的一面镜子:

arr = ["a", "b", "c", "d"]
print(arr[~0])   # d
print(arr[~1])   # c

~ 的典型用法类似于“交换镜像节点”或“在排序列表中查找中位数”:

"""swap mirror node"""
def reverse(arr: List[int]) -> None:
    for i in range(len(arr) // 2):
        arr[i], arr[~i] = arr[~i], arr[i]

"""find median in a sort list"""
def median(arr: List[float]) -> float:
    mid = len(arr) // 2
    return (arr[mid] + arr[~mid]) / 2

"""deal with mirror pairs"""
# verify the number is strobogrammatic, strobogrammatic number looks the same when rotated 180 degrees
def is_strobogrammatic(num: str) -> bool:
    return all(num[i] + num[~i] in '696 00 11 88' for i in range(len(num) // 2 + 1))

~ 实际上是反码和补码的数学技巧,在某些情况下更容易理解。

讨论是否应该使用像 ~ python技巧:

在我看来,如果它是由您自己维护的代码,您可以使用任何技巧来避免潜在的错误或实现目标更容易,因为可能具有高可读性和可用性。 但在团队合作中, 避免使用“过于聪明”的代码 ,可能会给同事带来麻烦。

例如,这是一个来自 Stefan Pochmann的 简洁代码来解决 这个问题 。 我从他的代码中学到了很多东西。 但有些只是为了好玩,太使用了。

# a strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside down)
# find all strobogrammatic numbers that are of length = n
def findStrobogrammatic(self, n):
    nums = n % 2 * list('018') or ['']
    while n > 1:
        n -= 2
        # n < 2 is so genius here
        nums = [a + num + b for a, b in '00 11 88 69 96'.split()[n < 2:] for num in nums]
    return nums

如果您有兴趣,我已经总结了这样的 python技巧

这个问题在这里已有答案:

list = ["a", "b", "c", "d"]
print(list[3]) # Number 3 is "d"

print(list[-4]) # Number -4 is "a"

你可以用这种方式直观地理解它

steps= ["a", "b", "c", "d"]

假设你从 ad 开始,a是你站立(或你的家)的起始点,所以将它标记为0(因为你还没有移动),

将一步移至b,将第二步移至c,然后移至第三步。

然后你如何从d回到(或从你的办公室返回你的家)。 你的家是 0 因为你的家人住在那里,所以你的办公室不能是 0 这是你的最后一站。

所以当你回到家里。 d是你开始回家的最后一站,c是最后一秒....


因为Python中的 -00
使用 0 您将获得列表的第一个元素
使用 -1 您将获得列表的最后一个元素

list = ["a", "b", "c", "d"]
print(list[0]) # "a"
print(list[-1]) # d

您还可以将其视为 list[len(list) - x] 简写,其中x是从后面开始的元素位置。 这仅在 0 < -(-x) < len(list)

print(list[-1]) # d
print(list[len(list) - 1]) # d
print(list[-5]) # list index out of range
print(list[len(list) - 5]) # a

这个习惯用法可以用模运算来证明。 我们可以将索引视为指向 通过向前走 i 元素获得 的列表中的单元格。 -1 引用列表的最后一个元素是对它的自然概括,因为如果我们从列表的开头向后走一步,我们就会到达列表中的最后一个元素。

对于任何列表 xs 和索引 i 正面或负面 ,表达式

xs[i]

将具有与下面的表达式相同的值或产生 IndexError

xs[i % len(xs)]

最后一个元素的索引是 -1 + len(xs) ,它与 -1 mod len(xs) 。 例如,在长度为12的数组中,最后一个元素的规范索引是11. 11与-1 mod 12一致。

但是在Python中,数组通常用作 线性 数据结构而不是 圆形 数据结构,因此大于 -1 + len(xs) 或小于 -len(xs) 超出范围,因为很少需要它们和如果数组的大小发生变化,效果将非常违反直觉。


list[-1]

简而言之:

list[len(list)-1]

len(list) 部分是隐含的。 这就是为什么 -1 是最后一个元素。 这适用于任何负面指数 - len(list) 的减法总是隐含的







list