我有一个列表,列表中的每个元素都包含两个用逗号分隔的数字。
我必须将每个列表中的第一项相互关联,与第二项相同。
给出一个列表,我必须将每个嵌套列表的第一个数字替换为该数字的平均值,列表中第一个数字在其右侧,列表中第一个数字在其左侧。与第二个数字相同。 对于第一个嵌套列表,我必须将其替换为平均值或数字本身及其右侧列表中的匹配数字。 最后,左侧列表相同。
例如:
[[1, 1], [7, 7], [20, 20], [9, 9], [-12, -12]]
将是:
[[(1+7)/2, (1+7)/2], [(7+1+20)/3, (7+1+20)/3], [(20+7+9)/3, (20+7+9)/3], [(9+20-12)/3, (9+20-12)/3], [(-12+9)/2, (-12+9)/2]]
因此:
[[4, 4], [9, 9], [12, 12], [5, 5], [-2, -2]]
因为我们要返回整数。
我有一个代码,但是它只打印平均值,这有点笨拙。请帮助我为如何计算元素以及创建新列表指明正确的方向。
此外,我只想使用循环和基本列表理解,因此我可以理解逻辑。
到目前为止,这是我的代码:
def lpf(lst):
for i in range(len(lst)):
for j in range(2):
if i == 0:
lst[i][j] = int((lst[i][j] + lst[i+1][j]) / 2)
elif 0 < i < (len(lst) - 1):
lst[i][j] = int((lst[i-1][j] + lst[i][j] + lst[i+1][j]) / 3)
elif i == len(lst) - 1:
lst[i][j] = int((lst[i-1][j] + lst[i][j]) / 2)
return lst
我们必须假设列表中的项目并不总是相同。
我似乎了解我的代码的问题-更改第一个元素后,下一次迭代将在新元素而非原始元素上进行。但是我无法考虑如何解决这个问题。
答案 0 :(得分:3)
您想要列表理解,我给您列表理解:
[[sum(s[p] for s in l[i-1 if i > 0 else 0:i+2])//(2 if i in (0,len(l)-1) else 3) for p in range(2)] for i in range(len(l))]
尽管如此,我还是建议将其分解为一个for循环,其中包含内部列表理解,因为它是如此难以理解。
工作示例:
>>> l = [[1, 1], [7, 7], [20, 20], [9, 9], [-12, -12]]
>>> [[sum(s[p] for s in l[i-1 if i > 0 else 0:i+2])//(2 if i in (0,len(l)-1) else 3) for p in range(2)] for i in range(len(l))]
[[4, 4], [9, 9], [12, 12], [5, 5], [-2, -2]]
没有列表理解的爆炸形式:
output = []
for i in range(len(l)):
if i == 0:
group = l[i:i+2]
averaged = [(group[0][0] + group[1][0])//2,
(group[0][1] + group[1][1])//2]
output.append(averaged)
elif i == len(l)-1:
group = l[i-1:i+1]
averaged = [(group[0][0] + group[1][0])//2,
(group[0][1] + group[1][1])//2]
output.append(averaged)
else:
group = l[i-1:i+2]
averaged = [(group[0][0] + group[1][0] + group[2][0])//3,
(group[0][1] + group[1][1] + group[2][0])//3]
output.append(averaged)
它像以前一样给output
:
[[4, 4], [9, 9], [12, 12], [5, 5], [-2, -2]]
答案 1 :(得分:1)
如果所有子列表项始终相同,则可以采用以下方法:
mylist = [1, 7, 20, 9, -12]
def avg_list(l):
return sum(l)/int(len(l))
avgs = [avg_list(mylist[max(0,i-1):min(len(mylist),i+2)]) for i in range(len(mylist))]
output = [[j, j] for j in avgs]
>>> [[4, 4], [9, 9], [12, 12], [5, 5], [-2, -2]]