Найти - Пользователи
Полная версия: Работа со списками , итераторы, все в кучу, сложновато...нужна помощ
Начало » Центр помощи » Работа со списками , итераторы, все в кучу, сложновато...нужна помощ
1
jacksson2012
Здравствуйте прошу помочь, дан список 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

таблица: искомый элемент, индекс искомого элемента , индекс найденного элемента
py.user.next
Непонятно, что нужно сделать.
Приведи входной список. Приведи результат, который должен для этого списка получиться.
jacksson2012
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

таблица: искомый элемент, индекс искомого элемента , индекс найденного элемента
py.user.next
При прохождении по элементам надо добавлять их в словарь по одному, где словарь состоит из пар (значение элемента, индекс элемента). При взятии нового элемента из списка надо искать для него элемент среди ключей в словаре, брать потом для ключа значение, а потом добавлять рассматриваемый элемент в словарь. Так у тебя в словаре всегда будут только ближайшие элементы к текущему в единственном экземпляре каждый.

Например, для списка
[1, 1, 1, 2, 2, 2, 3]
Поиск для первой двойки будет проходить в словаре
{1: 2}
Поиск для тройки будет проходить в словаре
{1: 2, 2: 5}
В конце перебора словарь будет
{1: 2, 2: 5, 3: 6}
То есть не будут перебираться все единицы и все двойки, потому что в словаре не бывает дубликатов ключей.
jacksson2012
py.user.next
При прохождении по элементам надо добавлять их в словарь по одному, где словарь состоит из пар (значение элемента, индекс элемента). При взятии нового элемента из списка надо искать для него элемент среди ключей в словаре, брать потом для ключа значение, а потом добавлять рассматриваемый элемент в словарь. Так у тебя в словаре всегда будут только ближайшие элементы к текущему в единственном экземпляре каждый.Например, для списка
это усложняет задачу
py.user.next
Да нет, всё просто. А в твоём варианте выполняются лишние операции, потому что ты выполняешь поиск по всем числам, встреченным ранее. Допустим, у тебя миллион единиц и двойка в конце, так ты будешь по всему миллиону единиц искать индекс последней единицы. А со словарём у тебя только одна единица в словаре будет.
jacksson2012
py.user.next
Да нет, всё просто. А в твоём варианте выполняются лишние операции, потому что ты выполняешь поиск по всем числам, встреченным ранее. Допустим, у тебя миллион единиц и двойка в конце, так ты будешь по всему миллиону единиц искать индекс последней единицы. А со словарём у тебя только одна единица в словаре будет.
пускай машина считает, не хочу запутаться, мне нужно как можно проще, я только осваиваю питон
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
>>> 
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB