2016-05-24 1 views
0

EDIT: Когда я говорю функцию в названии, я имею в виду функцию математической функции, а не функцию программирования. Извините за возникшую путаницу.создание простой функции с использованием списков операторов и целых чисел

Я пытаюсь создать функцию из произвольно генерируемых целых чисел и операторов. Подход, который я принимаю сейчас, следующий:

ШАГ 1: Генерировать случайный список операторов и целых чисел в виде списка.

ШАГ 2: Применить набор правил к списку, чтобы я всегда получал список целых чисел, операторов, целых чисел, операторов ... и т. Д.

ШАГ 3: Используйте модифицированный список для создания единого ответа после того, как операции были применены к целым числам.

Например:

ШАГ 1 РЕЗУЛЬТАТ: [1,2, +, -, 2, /, 3,8, *]

ШАГ 2 РЕЗУЛЬТАТ: [1, + 2, - , 2, /, 3, *, 8] - Обратите внимание, что я использую команду оператора для генерации операторов в списке.

STEP 3 RESULT: Выход предназначен для функции чтения слева направо, а не для применения BODMAS, поэтому в этом случае я ожидаю, что выход будет равен 8/3 (выход не должен быть целое число).

Итак, мой вопрос: какая функция (и внутри какого модуля) доступна, чтобы помочь мне объединить список, как определено выше. ИЛИ следует ли комбинировать список по-другому, чтобы позволить мне использовать определенную функцию?

Я рассматриваю возможность изменения способа генерации списка в первую очередь, так что я делаю вид на лету, но я думаю, что в конечном итоге я окажусь в той же ситуации, что я не знаю, как объединить целые числа и операторы после прохождения процесса сортировки.

Я чувствую, что здесь есть простое решение, и я привязываю себя в узлах без необходимости!

Любая помощь очень ценится,

Dom

+0

Можете ли вы попытаться разъяснить немного больше о том, что вы хотите от функции? вам нужна функция, которая выполняет случайные математические операции? – WildCard

+0

Я хочу, чтобы функция интерпретировала предопределенный список в математической функции, читаемой слева направо. Целые числа и операторы будут предопределены другой частью программы. – user3742808

+0

, так что у вас будет список ex. (1, +, 2, 3, /, 4) будет равняться 1 + 2 и 3/4? это то, что вы пытаетесь сделать? – WildCard

ответ

0

Почему бы не создать один список для Интс и один для операторов и их добавления от каждого шага списка за шагом?

редактировать: вы можете сначала конвертировать ваш Интс в строку затем, создать строку, используя строку = «» совместного (список) после того, что вы можете просто Eval (строка)

edit2:. Вы можете также взять посмотрите на модуль Sympy, который позволяет использовать символическую математику в python.

+0

Мне все равно нужно было бы понять, как сгенерировать ответ из списка, созданного с помощью вашего метода, не так ли? Но список создается путем интерпретации другого случайно созданного списка двоичных чисел, поэтому это не реально. – user3742808

+0

eval (string) не работает из-за приоритетной операции, которую OP не хочет здесь. 'Eval ('1 + 2-2/3 * 8') == -7/3', а не 8/3. Поэтому ему нужна скобка для 'eval ('((((1 + 2) -2)/3) * 8)')', да некоторые из них бесполезны, но, вероятно, проще просто добавить их повсюду. – polku

+0

Спасибо за дополнительные комментарии, я сейчас изучаю это. EDIT: Я только что видел комментарий polku, это может объяснить проблемы, которые у меня возникают. – user3742808

0

Я не знаю, было бы проще, но элегантным способом было бы использовать двоичное дерево, где листья являются операндами и другими узлами. Вы можете непосредственно создать его (без списков), делая что-то вроде этого (быстрый и грязный, наверное, неправильно, но вы получите идею):

def generate(root, end_depth, depth): 
    root = random_operator() 
    right_child = random_operand() 
    if depth == end_depth: 
     left_child = random_operand() 
    else: 
     generate(left_child, end_depth, depth + 1) 

Ваш пример хотел бы это:

  * 
    /\ 
    div 8 
    /\ 
    - 3 
/\ 
    + 2 
/\ 
1 2 

Это «назад», потому что, когда вы оцениваете, вам нужно начинать снизу, где известны два операнда.

0

Итак, для тех, кто заинтересован. Я достиг того, что было после, используя функцию eval(). Хотя это и не самый надежный, в конкретном цикле, который я написал, входы контролируются, поэтому я доволен этим подходом на данный момент.

 Смежные вопросы

  • Нет связанных вопросов^_^