1. ホーム
  2. python

[解決済み] なぜPythonはリストの末尾からインデックスを作成するとき、(0ではなく)インデックス-1から始めるのでしょうか? 重複] [重複

2023-03-22 07:05:30

質問

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

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

どのように解決するのですか?

別の言葉で説明すると、なぜなら -00 から始まる場合、後方は 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トリック をこんな感じでまとめてみました。