2015-03-12 2 views
1

Так что это простой вопрос, с которым я, похоже, запутался, я работал над этой проблемой ввода и пытался сохранить определенные части входа пользователя в сегментированные списки.Python List Indexing and Returning Item

Пользовательский ввод вводит CNF (конъюнктивная нормальная форма). Пример: + = или, * = и, что-нибудь в пределах (и) предложениме

(А + В) * (C + D)

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

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

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

cnf = input("CNF: ") 
cnf_input = list(cnf) 

cnf_input_len = len(cnf_input) 
i = 0 
##this count resets when it sees a ")" 
claus_count = 0 
while i < cnf_input_len: 

    claus_list = cnf_input.append(i) 
    print(cnf_input.index("B")) 
    if cnf_input.index(i)=="(": 
     print('Cut here') 
    i=i+1 

Мой код в качестве ориентира

+0

Вы всегда ожидали два пункта? или может быть любое количество статей? – Malonge

+0

Как я уже сказал, он динамичен, поэтому мне нужно выделить его соответственно тому, что вводит пользователь. Есть только 26 литералов (переменные: A, B, C ...), которые они могут вводить для ввода, но предложения могут быть как можно больше. Какой оператор я храню? «==»? – Frontier

ответ

2

кажется вам более усложняя его. просто использовать str.split с последующим по str.strip, чтобы получить отдельные оговорки в списке

>>> [elem.strip('()') for elem in "(A+B)*(C+D)".split("*")] 
['A+B', 'C+D'] 

Вы даже можете продлить его, чтобы получить отдельные литералы пунктов как кортеж или списки, чтобы получить список списков

>>> [elem.strip('()').split('+') for elem in "(A+B)*(C+D)".split("*")] 
[['A', 'B'], ['C', 'D']] 

Вы даже можете экспериментировать с регулярным выражением

>>> re.findall(r'([^()]+?)\+([^()]+?)', "(A+B)*(C+D)") 
[('A', 'B'), ('C', 'D')] 
+0

Чтобы расширить это, можно ли это перевести с помощью словаря, мне нужно каждое значение литерала, которое я использую, чтобы быть либо 1, либо 0 (1 - true, 0 - false). Мне нужно, чтобы мой вход настраивался таким образом, чтобы проверить, что каждый литерал должен быть для того, чтобы весь CNF был истинным, и я делаю это таким образом, чтобы каждый пункт имел хотя бы 1 (что делает сама статья истинна). – Frontier

1

Вы можете использовать регулярное выражение для определения начальных/конечных точек в формуле.

import re 

formula = r'\(([\w+\d+])([*+-/])([\w+\d+])\)([*+-/])\(([\w+\d+])([*+-/])([\w+\d+])\)' 
solve_for = '(A+B)*(C+D)' 
splitter = re.match(formula, solve_for).groups() 

Где разветвитель теперь кортеж ввода пользователя:

('A', '+', 'B', '*', 'C', '+', 'D')