高级列表理解:创建平均值

时间:2018-11-24 10:30:55

标签: python list

我有一个列表,列表中的每个元素都包含两个用逗号分隔的数字。

我必须将每个列表中的第一项相互关联,与第二项相同。

给出一个列表,我必须将每个嵌套列表的第一个数字替换为该数字的平均值,列表中第一个数字在其右侧,列表中第一个数字在其左侧。与第二个数字相同。 对于第一个嵌套列表,我必须将其替换为平均值或数字本身及其右侧列表中的匹配数字。 最后,左侧列表相同。

例如:

[[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

我们必须假设列表中的项目并不总是相同。

我似乎了解我的代码的问题-更改第一个元素后,下一次迭代将在新元素而非原始元素上进行。但是我无法考虑如何解决这个问题。

2 个答案:

答案 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]]