Уведомления

Группа в Telegram: @pythonsu

#1 Июль 24, 2018 09:19:45

jacksson2012
Зарегистрирован: 2018-07-24
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками , итераторы, все в кучу, сложновато...нужна помощ

Здравствуйте прошу помочь, дан список 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)

Офлайн

#2 Июль 24, 2018 10:29:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Работа со списками , итераторы, все в кучу, сложновато...нужна помощ

Непонятно, что нужно сделать.
Приведи входной список. Приведи результат, который должен для этого списка получиться.



Офлайн

#3 Июль 24, 2018 11:10:43

jacksson2012
Зарегистрирован: 2018-07-24
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками , итераторы, все в кучу, сложновато...нужна помощ

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

таблица: искомый элемент, индекс искомого элемента , индекс найденного элемента

Офлайн

#4 Июль 24, 2018 12:08:54

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Работа со списками , итераторы, все в кучу, сложновато...нужна помощ

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

Например, для списка

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

Офлайн

#5 Июль 24, 2018 12:57:00

jacksson2012
Зарегистрирован: 2018-07-24
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками , итераторы, все в кучу, сложновато...нужна помощ

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

Офлайн

#6 Июль 24, 2018 13:40:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Работа со списками , итераторы, все в кучу, сложновато...нужна помощ

Да нет, всё просто. А в твоём варианте выполняются лишние операции, потому что ты выполняешь поиск по всем числам, встреченным ранее. Допустим, у тебя миллион единиц и двойка в конце, так ты будешь по всему миллиону единиц искать индекс последней единицы. А со словарём у тебя только одна единица в словаре будет.



Отредактировано py.user.next (Июль 24, 2018 13:42:33)

Офлайн

#7 Июль 24, 2018 13:48:30

jacksson2012
Зарегистрирован: 2018-07-24
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа со списками , итераторы, все в кучу, сложновато...нужна помощ

py.user.next
Да нет, всё просто. А в твоём варианте выполняются лишние операции, потому что ты выполняешь поиск по всем числам, встреченным ранее. Допустим, у тебя миллион единиц и двойка в конце, так ты будешь по всему миллиону единиц искать индекс последней единицы. А со словарём у тебя только одна единица в словаре будет.
пускай машина считает, не хочу запутаться, мне нужно как можно проще, я только осваиваю питон

Офлайн

#8 Июль 24, 2018 15:02:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Работа со списками , итераторы, все в кучу, сложновато...нужна помощ

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

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version