我有一个清单清单。每个子列表包含两个整数元素。我想将每个元素乘以1.2,如果它们是正数且大于某个特定数字,则将其更改为该特定数字。如果它们较小,则相同。 我使用列表推导获得的乘法位。有了这些额外的条件,我有点迷路了-对我来说,它似乎过于复杂,甚至是非Python的。我想知道是否可以得到一些意见。
我使用列表推导获得的乘法位。有了这些额外的条件,我有点迷路了-对我来说,它似乎过于复杂,甚至是非Python的。我对如何将所有条件纳入列表理解有一个粗略的想法,但是当我开始实现它们时,我感到困惑。我想知道是否可以得到一些意见。
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]
首先,我很确定存在语法问题。但是,对于每个数字,我必须检查它的正数还是负数,然后,是否大于或小于最大/最小音量。那么,使用列表理解有可能吗?它高效且Pythonic吗?
非常感谢您!
答案 0 :(得分:2)
使用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 :(得分:1)
定义一个边界函数,该函数不允许该值超过最大或最小体积。然后您仍然可以使用列表推导。
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]
答案 2 :(得分:0)
如果列表理解太复杂,请不要使用它。您应该尝试使解决方案易于他人理解,并让您易于理解,如果一年后再使用它。
for x,y in audio_data:
if x > MAX_VOL:
foo = int(x*1.2)
bar = int(y*1.2)
if x == MAX_VOL:
...