Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Объясните примерно, как работает .  (Прочитано 580 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Объясните примерно, как работает .
« : 16 Декабря 2015, 00:28:07 »
Разбираться в 4 методах немного голова устала, объясните пожалуйста, хоть примерно, как это работает?
Код: (python) [Выделить]
def max_sum(my_list):
    max_sum = 0
    list_length = len(my_list)
    r_border = list_length +но ка 1
    for i in range(list_length):
        for j in range(i + 1, r_border):
            sum_part = sum(my_list[i:j])
            if sum_part > max_sum:
                max_sum, left, right = sum_part, i, j - 1
    return (max_sum, left, right)

Axa-Ru

  • Гость
Re: Объясните примерно, как работает .
« Ответ #1 : 16 Декабря 2015, 00:37:19 »
r_border = list_length +но ка 1

Здесь что то не так.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Объясните примерно, как работает .
« Ответ #2 : 16 Декабря 2015, 00:40:58 »
Оно работает, при этом как 3 других метода, т.е правильно. Так что не знаю что там не так.

Axa-Ru

  • Гость
Re: Объясните примерно, как работает .
« Ответ #3 : 16 Декабря 2015, 00:44:29 »
Что значат символы "+но ка" ?
Как я понимаю это опечатка.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Объясните примерно, как работает .
« Ответ #4 : 16 Декабря 2015, 00:48:48 »
Ой, да, это действительно опечатка.

Пользователь решил продолжить мысль 16 Декабря 2015, 00:56:15:
Код: (python) [Выделить]
def max_sum(my_list):
    max_sum = 0
    list_length = len(my_list)
    r_border = list_length + 1
    for i in range(list_length):
        for j in range(i + 1, r_border):
            sum_part = sum(my_list[i:j])
            if sum_part > max_sum:
                max_sum, left, right = sum_part, i, j - 1
    return (max_sum, left, right)
« Последнее редактирование: 16 Декабря 2015, 00:56:15 от DenisVASI »

Оффлайн steelsoul

  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Объясните примерно, как работает .
« Ответ #5 : 16 Декабря 2015, 01:03:27 »
DenisVASI,
вот этот участок кода выполняет все основные действия, которые я постараюсь описать.

    for i in range(list_length): # цикл по всему списку
     for j in range(i + 1, r_border): # ещё один внутренний цикл, от i-го элемента и до правой границы (длина списка + 1, вроде)
            sum_part = sum(my_list[i:j]) # считается сумма списка от i до j элемента в переменную sum_part
            if sum_part > max_sum: # если эта сумма больше max_sum, то
                max_sum, left, right = sum_part, i, j - 1 # происходит присваивание почленно каждого элемента.
# т.е. max_sum = sum_part; left = i; right = j-1

Ну и в качестве параметра функция max_sum принимает судя по всему список списков, и ищет наибольшую сумму в этих списках, и выводит, собственно, сумму, левый индекс и правый индекс.

Я надеюсь, что хоть что-то прояснилось.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Объясните примерно, как работает .
« Ответ #6 : 16 Декабря 2015, 01:11:16 »
Это получается просто перебор всех массивов подряд?

Оффлайн steelsoul

  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Объясните примерно, как работает .
« Ответ #7 : 16 Декабря 2015, 01:16:02 »
DenisVASI,

похоже на то. Лучше, конечно, увидеть весь код, а именно место, где эта функция вызвана и с каким параметром, тогда можно сказать 100%.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Объясните примерно, как работает .
« Ответ #8 : 16 Декабря 2015, 01:17:56 »
Код: (python) [Выделить]
__author__ = 'denis'
import pandas as pd
import urllib.request
req = urllib.request.urlopen('https://docs.google.com/uc?id=0B6tmfSj7DGacX1RNekVjUXB0MGc&export=download')
page = req.read()
ar = pd.read_csv('data.csv', sep=',', header=None, skiprows=5, skipfooter=4)
b = [round(x,4) for x in ar[1]]
b.reverse()
c = [str(x) for x in ar[0]]
c.reverse()
a = [0]
for i in range(1, len(b), 1):
  a.append(b[i] - b[i - 1])


def max_sum(my_list):
    max_sum = 0
    list_length = len(my_list)
    r_border = list_length + 1
    for i in range(list_length):
        for j in range(i + 1, r_border):
            sum_part = sum(my_list[i:j])
            if sum_part > max_sum:
                max_sum, left, right = sum_part, i, j - 1
    return (max_sum, left, right)

sum, min, max = max_sum(a)
print(b)
print(a)
print(c)
print(sum," ", min," ", max)
print(sum," ", c[min], " ", c[max])


Пользователь решил продолжить мысль [time]16 Декабрь 2015, 02:18:59[/time]:
Если не скачает:
https://docs.google.com/uc?id=0B6tmfSj7DGacX1RNekVjUXB0MGc&export=download

Пользователь решил продолжить мысль [time]16 Декабрь 2015, 02:24:07[/time]:
Подождите, сейчас лучше скину файлы с курсами.

Пользователь решил продолжить мысль 16 Декабря 2015, 01:26:19:
Вот:
https://drive.google.com/file/d/0B6tmfSj7DGacMk5fZHV2NTFaTXM/view?usp=sharing
« Последнее редактирование: 16 Декабря 2015, 01:26:19 от DenisVASI »

Оффлайн steelsoul

  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Объясните примерно, как работает .
« Ответ #9 : 16 Декабря 2015, 01:42:24 »
DenisVASI,
b = [round(x,4) for x in ar[1]]
это - заполнение списка в котором каждый элемент получен с помощью round(x,4) для всего ar[1].

for i in range(1, len(b), 1):
  a.append(b - b[i - 1])
это -добавление к а разницы между элементом и предыдущим с массива в.

Здесь находится максимальная сумма элементов массива с некоторой позиции в непрерывном диапазоне,
для этого и происходит перебор по двум индексам
    for i in range(list_length):
        for j in range(i + 1, r_border):

Таким образом сначала перебераются все элементы в диапазоне [0..1], [0..2], [0..3] .., затем [1 ..2, 1..3, 1..4].., затем [2..3, 2..4, 2..5...] ... , затем [list_length-2, ...list_lengt-1, list_length-2, list_length, ...]...
В результате будут перебраны все возможные диапазоны.

Массив b - массив округленных значений из таблицы.
Массив а - массив разниц между элементами массива b.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: Объясните примерно, как работает .
« Ответ #10 : 16 Декабря 2015, 01:49:47 »
Ну, как эта часть работает сам знаю,мне был интересен сам алгоритм,спасибо за помощь :) :)

 

Страница сгенерирована за 0.073 секунд. Запросов: 25.