1

Тема: задача №29 з codeabbey

Виникла проблема з цією задачею - https://www.codeabbey.com/index/task_vi … ndexes--ru
Мій код

def min(el_1, el_2):
    if el_1 <= el_2:
        return el_1, el_2
    else:
        return el_2, el_1

def do(inp, n):
    a = inp.pop(0)
    b = inp.pop(0)
    for i in range(n - 2):
        a, b = min(a, b)
        out_x.append(a)
        a = b
        b = inp.pop(0)
    a, b = min(a, b)
    out_x.append(a)
    out_x.append(b)
    return out_x


out_x = []
lich = 0
n = int(input())
inp = input()
inp = inp.split()
inp_x = inp
while out_x != inp:
    out_x = do(inp, n)
    inp = inp_x
    inp_x = out_x
    lich += 1
    print(out_x)# В остаточній версії цьго прінта не буде
print(out_x)# і цього теж

.
Це пробна версія проги, яка мала б робити, але...
Помилка:

4
50 98 17 79
['50', '17', '79', '98']
Traceback (most recent call last):
  File "C:\Users\xxxl\source\repos\PythonApplication14\PythonApplication14\PythonApplication14.py", line 28, in <module>
    out_x = do(inp, n)
  File "C:\Users\xxxl\source\repos\PythonApplication14\PythonApplication14\PythonApplication14.py", line 8, in do
    a = inp.pop(0)
IndexError: pop from empty list

2

Re: задача №29 з codeabbey

input() #перше число в python не дуже потрібне
ar=[int(x) for x in input().split()] #вводимо масив
print(" ".join(str(ar.index(x)+1) for x in sorted(ar)) #і трохи питонячої магії 
Подякували: leofun01, Eff1c2

3 Востаннє редагувалося koala (26.12.2018 22:11:00)

Re: задача №29 з codeabbey

Хоча...

input();print(' '.join(str(x[0]) for x in sorted(enumerate(map(int,input().split()),1),key=lambda x:x[1])))

Якось так

Подякували: Eff1c1

4 Востаннє редагувалося Eff1c (27.12.2018 01:21:52)

Re: задача №29 з codeabbey

Дякую  :)  ;)
Можете ще будь ласка пояснити що робить цей код

key=lambda x:x[1]

Буду дуже вдячний.

5

Re: задача №29 з codeabbey

Eff1c написав:

Дякую  :)  ;)
Можете ще будь ласка пояснити що робить цей код

key=lambda x:x[1]

Буду дуже вдячний.

лямбда - це така собі анонімна функція.
на вхід приймає параметр х (в даному випадку - кортеж), на вихлді повертає елемент цього кортежа з індексом 1

def _lambda(x):
    return x[1]
Подякували: leofun01, Eff1c2

6 Востаннє редагувалося koala (27.12.2018 11:33:02)

Re: задача №29 з codeabbey

Функція sorted має названий параметр key - функцію (зокрема лямбду), яка перетворює об'єкт, що сортується, на ключ, за яким відбувається сортування. Наприклад, сортування за модулем можна зробити так:

>>> sorted([5,-3,-2,8], key=abs)
[-2, -3, 5, 8]

Елементи відсортовані в тому порядку, в якому йдуть їхні модулі.
Про лямбду вже написали.

Подякували: leofun01, Eff1c2

7

Re: задача №29 з codeabbey

koala написав:
input();print(' '.join(str(x[0]) for x in sorted(enumerate(map(int,input().split()),1),key=lambda x:x[1])))

І так, що я зрозумів, а що ні...
Пропускаємо перший ввід.
Виводим те що в дужках:

' '.join(str(x[0])

Об'єднуємо з пропуском між елементами 0-й елемент списку х
for х in :

map(int,input().split())

Застосовуєм до кожного введеного елемента int.

enumerate(map(int,input().split()),1

Даєм кожному елементу списку порядковий елемен, починаючи з 1.

sorted( ... ,key=lambda x:x[1])

Тут не дуже зрозумів... Сортує, по 1 (по суті по 2-му, бо з 0 відлік) елементу  даного списку? Якщо так, то як це?

Не дуже розумію як працює конструкція ... for x in ...

Також не зрозумів, чому в дужках join - x[0] ? Чому воно дорівнює? Ладно якби просто х, для мене це було б логічно.

8 Востаннє редагувалося /KIT\ (27.12.2018 23:13:26)

Re: задача №29 з codeabbey

Альтернативний варіант без for:

#input()
print(*map(lambda x:x[0]+1,sorted(enumerate(map(int,input().split())),key=lambda x:x[1]))) #тепер ще менше (90 байт)
Подякували: Eff1c1

9

Re: задача №29 з codeabbey

Ви неправильно це читаєте. Функціональний запис заплутує. Запровадимо проміжні змінні (в коментарях - значення):

input() #викидаємо
input_str = input() #"50 98 17 79"
input_str_list = input_str.split() #["50","98","17","79"]
input_int_map = map(int, input_str_list) #map object зі значеннями 50, 98, 17, 79
enumerated_input = enumerate(input_int_map, 1) #enumerate object зі значеннями (1,50), (2,98), (3,17), (4,79)
sorted_list = sorted(enumerated_input, key=lambda x:x[1]) #[(3,17), (1,50), (4,79), (2,98)]
generator_str = (str(x[0]) for x in sorted_list) #generator object зі значеннями "3","1","4","2"
joined_result = ' '.join(generator_str) #'3 1 4 2'
print(joined_result)

насправді ' '.join не дуже потрібен, якщо ви знайомі з оператором *:

print(*generator_str)
Подякували: leofun01, Eff1c2

10

Re: задача №29 з codeabbey

/KIT\ написав:

Альтернативний варіант без for:

#input()
print(' '.join(map(lambda x:str(x[0]+1),sorted(enumerate(map(int,input().split())),key=lambda x:x[1]))))

Дякую)
Дещо незрозуміле залишилося.
join тепер для мене цілком логічний.
Не розумію, чому спочатку сортуємо по

key=lambda x:x[1]

, а потім до всього цього списку застосовуєм

lambda x:str(x[0]+1)

.

11

Re: задача №29 з codeabbey

Бо умова така.
Тільки враховуйте, що у мене enumerate(..., 1), а в /KIT\ - enumerate(...) просто, тобто з 0.

Подякували: Eff1c1

12

Re: задача №29 з codeabbey

Аааааа. Нарешті зрозумів  *SCRATCH*
Я просто подумав, що в join в дужках тільки str(x[0])
Не подумав, що там взято в дужки все наступне.
Дуже всім дякую :)

13

Re: задача №29 з codeabbey

ну і поскільки з зараз в основному працюю з Pandas, то наведу таке рішення

import pandas as pd
print(*pd.Series(index=range(1, int(input()) + 1), data=map(int, input().split())).sort_values().index.values)
Подякували: /KIT\, koala, Eff1c3