Форум сайта python.su
0
Здравствуйте прошу помочь, дан список data, необходимо найти для каждого элемента списка в строну уменьшения индекса , элемент наиболее приблизительно равный ему, и “выделить” именно первый найденный в сторону уменьшения индексов элемент, и теперь записать в таблицу в столбик значения: искомого элемента, индекс искомого элемента,индекс найденного элемента
как все это сделать по отдельности я примерно знаю, но когда начинаю собирать все в одно, начинаются ошибки:
# так ищем наименьшее def nearest(lst,target): return min(lst,key=lambda x: abs(x-target)) # и как то потом все запутывается def hh(i,data): for u in range(data.index(i),0,-1): # это позволяет начинать отсчет обратно от элемента b=nearest(data[0:data.index(i)],i) # тут я все похерил b.append(data[data.index(i)]-data[u]) # все потеряно print(u,data[u]) for i in data: hh(i,data)
data=[1,2,2,4,5,2] 1 0 0 2 1 0 2 2 1 4 3 0 5 4 0 2 5 2
Отредактировано jacksson2012 (Июль 24, 2018 13:39:22)
Офлайн
857
Непонятно, что нужно сделать.
Приведи входной список. Приведи результат, который должен для этого списка получиться.
Офлайн
0
py.user.next
Непонятно, что нужно сделать.Приведи входной список. Приведи результат, который должен для этого списка получиться.
data = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,0.1,0.2,0.3,0.4,0.5,1.1] 0.1 0 0 0.2 1 0 0.3 2 1 0.4 3 2 0.5 4 3 0.6 5 4 0.7 6 5 0.8 7 6 0.9 8 7 1 9 8 1.1 10 9 1.2 11 10 1.3 12 11 1.4 13 12 1.5 14 13 1.6 15 14 1.7 16 15 1.8 17 16 1.9 18 17 0.1 19 0 0.2 20 1 0.3 21 2 0.4 22 3 0.5 23 4 1.1 24 10
Офлайн
857
При прохождении по элементам надо добавлять их в словарь по одному, где словарь состоит из пар (значение элемента, индекс элемента). При взятии нового элемента из списка надо искать для него элемент среди ключей в словаре, брать потом для ключа значение, а потом добавлять рассматриваемый элемент в словарь. Так у тебя в словаре всегда будут только ближайшие элементы к текущему в единственном экземпляре каждый.
Например, для списка
[1, 1, 1, 2, 2, 2, 3]
{1: 2}{1: 2, 2: 5}{1: 2, 2: 5, 3: 6}Отредактировано py.user.next (Июль 24, 2018 12:16:49)
Офлайн
0
py.user.nextэто усложняет задачу
При прохождении по элементам надо добавлять их в словарь по одному, где словарь состоит из пар (значение элемента, индекс элемента). При взятии нового элемента из списка надо искать для него элемент среди ключей в словаре, брать потом для ключа значение, а потом добавлять рассматриваемый элемент в словарь. Так у тебя в словаре всегда будут только ближайшие элементы к текущему в единственном экземпляре каждый.Например, для списка
Офлайн
857
Да нет, всё просто. А в твоём варианте выполняются лишние операции, потому что ты выполняешь поиск по всем числам, встреченным ранее. Допустим, у тебя миллион единиц и двойка в конце, так ты будешь по всему миллиону единиц искать индекс последней единицы. А со словарём у тебя только одна единица в словаре будет.
Отредактировано py.user.next (Июль 24, 2018 13:42:33)
Офлайн
0
py.user.nextпускай машина считает, не хочу запутаться, мне нужно как можно проще, я только осваиваю питон
Да нет, всё просто. А в твоём варианте выполняются лишние операции, потому что ты выполняешь поиск по всем числам, встреченным ранее. Допустим, у тебя миллион единиц и двойка в конце, так ты будешь по всему миллиону единиц искать индекс последней единицы. А со словарём у тебя только одна единица в словаре будет.
Офлайн
857
>>> def get_nearest(lst, target): ... return min(lst, key=lambda x: abs(x - target)) ... >>> lst = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, ... 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 0.1, 0.2, 0.3, 0.4, 0.5, 1.1] >>> >>> out = [] >>> dct = {lst[0]: 0} >>> for i, e in enumerate(lst): ... out.append((e, i, dct[get_nearest(dct, e)])) ... dct[e] = i ... >>> for i in out: ... print(i) ... (0.1, 0, 0) (0.2, 1, 0) (0.3, 2, 1) (0.4, 3, 2) (0.5, 4, 3) (0.6, 5, 4) (0.7, 6, 5) (0.8, 7, 6) (0.9, 8, 7) (1, 9, 8) (1.1, 10, 9) (1.2, 11, 10) (1.3, 12, 11) (1.4, 13, 12) (1.5, 14, 13) (1.6, 15, 14) (1.7, 16, 15) (1.8, 17, 16) (1.9, 18, 17) (0.1, 19, 0) (0.2, 20, 1) (0.3, 21, 2) (0.4, 22, 3) (0.5, 23, 4) (1.1, 24, 10) >>>
>>> def get_nearest(lst, target): ... return min(lst, key=lambda x: abs(x - target)) ... >>> def f(lst): ... out = [] ... dct = {lst[0]: 0} if lst else {} ... for i, e in enumerate(lst): ... out.append((e, i, dct[get_nearest(dct, e)])) ... dct[e] = i ... return out ... >>> lst = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, ... 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 0.1, 0.2, 0.3, 0.4, 0.5, 1.1] >>> >>> for item, idx1, idx2 in f(lst): ... print('{:5} {:5} {:5}'.format(item, idx1, idx2)) ... 0.1 0 0 0.2 1 0 0.3 2 1 0.4 3 2 0.5 4 3 0.6 5 4 0.7 6 5 0.8 7 6 0.9 8 7 1 9 8 1.1 10 9 1.2 11 10 1.3 12 11 1.4 13 12 1.5 14 13 1.6 15 14 1.7 16 15 1.8 17 16 1.9 18 17 0.1 19 0 0.2 20 1 0.3 21 2 0.4 22 3 0.5 23 4 1.1 24 10 >>>
Отредактировано py.user.next (Июль 24, 2018 15:08:32)
Офлайн