Расширенное понимание списка: создание средних - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть список, каждый элемент в списке в списке, содержащем 2 числа, разделенных запятой.

Мне приходится относиться к первым элементам в каждом списке по отношению друг к другу, так же, как ко второмуединицы.

Учитывая список, я должен заменить первое число каждого вложенного списка на среднее число, первое число в списке справа и первое число в списке слева.то же самое со вторым номером.Для первого вложенного списка я должен заменить его на среднее значение или само число и его соответствующий номер в списке справа.Для последнего то же самое со списком слева.

Например:

[[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 голосов
/ 24 ноября 2018

Вот способ, которым вы можете сделать это, если все элементы вашего подсписка всегда одинаковы:

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]]
0 голосов
/ 24 ноября 2018

Вы хотели понять списки, я даю вам понимание списков:

[[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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...