Использование понимания списка с более чем 4 условиями - PullRequest
1 голос
/ 20 апреля 2019

У меня есть список списков.Каждый подсписок содержит два целочисленных элемента.Я хотел бы умножить каждый из этих элементов на 1,2, и если они положительные и больше определенного числа, измените их на это определенное число.То же самое, если они меньше.Бит умножения, которого я достиг, используя понимание списка.С этими дополнительными условиями я немного теряюсь - мне это кажется слишком сложным и даже непитонным.Мне было интересно, могу ли я получить некоторые мнения.

Бит умножения, который я достиг, используя понимание списка.С этими дополнительными условиями я немного теряюсь - мне это кажется слишком сложным и даже непитонным.У меня есть приблизительное представление о том, как включить все условия в понимание списка, но когда я начал их реализовывать, я запутался.Мне было интересно, могу ли я получить некоторые мнения.

MAX_VOL = 32767  # audio data is the list of lists
MIN_VOL = -32767
audio_list = [[int(x*1.2), int(y*1.2)] for x, y in audio_data]

# My idea was something like:
audio_list = [[int(x*1.2), int(y*1.2) if x > MAX_VOL x == MAX VOL if x < MIN_VOL....] for x, y in audio_data]

Во-первых, я почти уверен, что есть проблема с синтаксисом.Но для каждого числа я должен проверить, является ли он положительным или отрицательным, затем, если он больше или меньше, чем максимальная / минимальная громкость.Итак, возможно ли это с помощью понимания списка?Это эффективно и питонно?

Спасибо большое!

Ответы [ 3 ]

2 голосов
/ 20 апреля 2019

Используйте min и max:

MAX_VOL = 32767  # audio data is the list of lists
MIN_VOL = -32767

audio_list = [[int(max(MIN_VOL, min(MAX_VOL, x*1.2))), int(max(MIN_VOL, min(MAX_VOL, y*1.2)))] for x, y in audio_data]

И поскольку это длинные выражения, используйте также функцию:

def clip(s):
    return int(max(MIN_VOL, min(MAX_VOL, s)))
audio_list = [[clip(x*1.2)), clip(y*1.2)] for x, y in audio_data]
1 голос
/ 20 апреля 2019

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

MAX_VOL = 32767  # audio data is the list of lists
MIN_VOL = -32767

# Ensure volume does not exceed limits.
def bounded(val):
    if val > MAX_VOL:
        return MAX_VOL
    elif val < MIN_VOL:
        return MIN_VOL
    return val

audio_list = [[bounded(int(x*1.2)), bounded(int(y*1.2))] for x, y in audio_data]
0 голосов
/ 20 апреля 2019

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

for x,y in audio_data:
    if x > MAX_VOL:
        foo = int(x*1.2)
        bar = int(y*1.2)
    if x == MAX_VOL:
        ...
...