Способ преобразования «1, 2, 3, 4, 5, 6, 7, 8, 9» в «-4, -3, -2, -1, 0, 1, 2, 3, 4» - PullRequest
0 голосов
/ 15 марта 2020

У меня есть это основание c l oop:

for x in range(1, len(testList) + 1)
        print(x, end=", ")

Скажем, testList - это длина 9. Затем это выдаст 1, 2, 3, 4, 5, 6, 7, 8, 9. Проблема в том, что я хочу распечатать -4, -3, -2, -1, 0, 1, 2, 3, 4. Может кто-нибудь сказать мне, как это сделать?

ПРИМЕЧАНИЕ: Я не могу просто вычесть 5 или константу при изменении длины testList.

1 Ответ

3 голосов
/ 15 марта 2020

Итак, если вы хотите настроить начальную точку на что-то, связанное с длиной списка, просто используйте длину списка для вычисления дельты, например:

for x in range(len(testList)):
    print(x - len(testList) // 2, end=", ")

нужно привести это в порядок для крайних случаев, например, что делать, если список имеет четное количество элементов, но это все та же концепция, используя длину, чтобы определить, как изменить каждый элемент.

Вы должны также поймите, что вы получите закрывающий разделитель с этим кодом без перевода строки в конце. Ниже приведено одно исправление этой проблемы.

Это действительно лишь пример того, как вы можете настроить начальную точку.


Конечно, вы всегда можете выбрать более Pythoni. c:

>>> print(", ".join([str(n - len(testList) // 2) for n in range(len(testList))]))
-4, -3, -2, -1, 0, 1, 2, 3, 4

хотя, если вы начинаете с Python, это может быть не очень хорошей идеей: -)

Это приятно знать эти вещи по мере того, как вы становитесь более продвинутыми, но это не обязательно способствует изучению языка для начала. Приведенное ниже объяснение действительно для новых Python разработчиков, не стесняйтесь игнорировать, если вы уже понимаете понимание списка.

Оно также имеет то преимущество, что не ставит разделитель после последнего элемента и работает следующим образом:

  1. for l oop дает вам последовательность пунктов 0..n-1, где n - длина списка.
  2. n-len(x)//2 настраивает те, чтобы дать вам диапазон (приблизительно) центрирован вокруг нуля.
  3. str() превращает их в строки.
  4. Окружающие [] символы превращают всю последовательность в список.
  5. join объединяет эти элементы списка вместе с ", " в качестве разделителя.

С точки зрения того, что делать, если вы хотите, чтобы он центрировался точно вокруг нуля с четным или нечетная длина списка (как вы упомянули в комментарии), правильное утверждение будет следующим:

print(", ".join([str(n + 0.5 - len(testList) / 2) for n in range(len(testList))]))

Это можно подтвердить с помощью следующей расшифровки:

>>> for i in range(10):
...     testList = [0] * i
...     print(i, ":", ", ".join([str(n + 0.5 - len(testList) / 2) for n in range(len(testList))]))
...
0 :
1 : 0.0
2 : -0.5, 0.5
3 : -1.0, 0.0, 1.0
4 : -1.5, -0.5, 0.5, 1.5
5 : -2.0, -1.0, 0.0, 1.0, 2.0
6 : -2.5, -1.5, -0.5, 0.5, 1.5, 2.5
7 : -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0
8 : -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5
9 : -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...