Я пытался выяснить следующую проблему через понимание списка, но я не мог заставить его работать. Я покажу вам, как я решил проблему, используя цикл и понимание списка.

Итак, у меня есть список, который может содержать от 0 до 6 элементов в диапазоне (6), и когда я применяю свою функцию к нему, я хочу изменить значения, как показано здесь:

l = [0, 1, 2, 3, 4, 5]
mirror = [5, 4, 3, 2, 1, 0]

Я не хочу просто поворачивать массив на 180 градусов, но на самом деле я хочу заменить значения. Например, мой список теперь выглядит так:

l = [2, 5]

Тогда список l_inverted должен выглядеть так:

l_inverted = [3, 0]

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

l = [0, 3, 5]
mirror = [5, 4, 3, 2, 1, 0]
i = 0
for element in l:
    l[i] = mirror[element]
    i += 1

Это фактически инвертирует список l. Вот мой подход, использующий понимание списка:

l = [3, 5]
mirror = [5, 4, 3, 2, 1, 0]
for element in l:
    print(element)
    l = [mirror[element] if x==element else x for x in l]

Это отлично работает. До того как:

l = [0, 3, 5]
mirror = [5, 4, 3, 2, 1, 0]
for element in l:
    print(element)
    l = [mirror[element] if x==element else x for x in l]

Таким образом, он заменит 5 на 0, 2 на 3, и обе 5 (и новая тоже) станут 0. Очевидно, я не хочу этого так.

Должен ли я придерживаться рабочего решения или есть плавный способ решить его с помощью списочных представлений? Я пытаюсь постоянно практиковать понимание списков, но это еще не полностью в моем мозгу. Большое спасибо.

3
MarcelB 28 Фев 2018 в 20:05

3 ответа

Лучший ответ

Если вы хотите это как понимание списка:

>> l = [0, 3, 5]
>> mirror = [5, 4, 3, 2, 1, 0]
>> l_inverted = [mirror[x] for x in l]
>> l_inverted
[5, 2, 0]
1
DBedrenko 28 Фев 2018 в 17:12

Судя по вашим первым двум примерам, вы ищете дополнение каждого значения списка в соответствии с некоторой базой, аналогично их дополнение. Вы можете либо жестко закодировать базу как 5, либо считать, что это максимальное число в списке, и рассчитать его. Вот решение для последнего:

< Сильный > Концепция

<this complement> = <max value in list> - <this value>

< Сильный > Код

values = [0, 3, 2, 4, 5]
max_value = max(values)
complements = [max_value - value for value in values]
print complements

< Сильный > Результат

[5, 2, 3, 1, 0]
1
MarredCheese 4 Сен 2019 в 20:38

Вы тонете в ложке воды и пытаетесь взять нас с собой. Вы используете плохие соглашения об именах, которые усложняют понимание вашей простой проблемы.

orig = [0, 1, 2, 3, 4, 5]
orig_rev = l[::-1]

selector = [0, 3, 5]

result = [orig_rev[i] for i in selector]
print(result )  # [5, 2, 0]
2
Ev. Kounis 28 Фев 2018 в 17:13