Форум сайта python.su
Здравствуйте прошу помочь, дан список 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)
Офлайн
Непонятно, что нужно сделать.
Приведи входной список. Приведи результат, который должен для этого списка получиться.
Офлайн
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
Офлайн
При прохождении по элементам надо добавлять их в словарь по одному, где словарь состоит из пар (значение элемента, индекс элемента). При взятии нового элемента из списка надо искать для него элемент среди ключей в словаре, брать потом для ключа значение, а потом добавлять рассматриваемый элемент в словарь. Так у тебя в словаре всегда будут только ближайшие элементы к текущему в единственном экземпляре каждый.
Например, для списка
[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)
Офлайн
py.user.nextэто усложняет задачу
При прохождении по элементам надо добавлять их в словарь по одному, где словарь состоит из пар (значение элемента, индекс элемента). При взятии нового элемента из списка надо искать для него элемент среди ключей в словаре, брать потом для ключа значение, а потом добавлять рассматриваемый элемент в словарь. Так у тебя в словаре всегда будут только ближайшие элементы к текущему в единственном экземпляре каждый.Например, для списка
Офлайн
Да нет, всё просто. А в твоём варианте выполняются лишние операции, потому что ты выполняешь поиск по всем числам, встреченным ранее. Допустим, у тебя миллион единиц и двойка в конце, так ты будешь по всему миллиону единиц искать индекс последней единицы. А со словарём у тебя только одна единица в словаре будет.
Отредактировано py.user.next (Июль 24, 2018 13:42:33)
Офлайн
py.user.nextпускай машина считает, не хочу запутаться, мне нужно как можно проще, я только осваиваю питон
Да нет, всё просто. А в твоём варианте выполняются лишние операции, потому что ты выполняешь поиск по всем числам, встреченным ранее. Допустим, у тебя миллион единиц и двойка в конце, так ты будешь по всему миллиону единиц искать индекс последней единицы. А со словарём у тебя только одна единица в словаре будет.
Офлайн
>>> 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)
Офлайн