2016-05-07 4 views
-3

Проблема: использование любого слова в строке для поиска элемента в списке и идентификации элемента или возврата индекса.Использование любого слова в строке для поиска элемента в списке и идентифицирующего элемента

Здравствуйте, я искал этот сайт и другие сайты, чтобы найти решение моей проблемы. Решения, которые я нашел успешны в определении, если в списке есть элемент в строке,

Пример:

any(word in str1 for word in List) 

Но это только возвращает истину или ложь, и с командой,

print word 

возвращает ошибку

Мне нужно решение, которое может обнаружить местонахождение элемента списка и либо распечатать деталь, или дать индекс внутри списка.

Проект, с помощью которого я использую это как ИИ, который имеет возможность преформировать математическое уравнение. Для этого он должен иметь возможность находить операторов, которые являются не только стандартными «+, -, *, /», но и форматами слов. Например, «плюс, минус и т. Д.» Когда он находится, программа может просто заменить элементы в строке правильными стандартными операторами, которые может обрабатывать eval().

Пример кода из проекта повторно:

from __future__ import division 
import re 
from math import * 
Listopp = ["+","-", "*","/"] 
Listadd = ["add","plus"] 
Listsub = ["subtract","minus"] 
Listmult = ["times","multiply","x"] 
Listdivide = [ "divide","over"] 
Listmath =Listopp + Listadd + Listsub + Listmult + Listdivide 

try: 
    str1 = raw_input("what is your math problem?") 

    if (any(word in str1 for word in Listmath) and re.findall(r"[-+]?\d*\.\d+|\d+",str1) != []): 


# here is where the solution need to be placed 

     opp = Listmath.index(any(word in str1)) 

     # needs to be identified or indexed 


#Replaced with standard operators 
     if (opp in Listdivide): 
      str1 = str1.replace(opp ,"/") 

     if (opp in Listmult): 
      str1 = str1.replace(opp ,"*") 

     if (opp in Listsub): 
      str1 = str1.replace(opp ,"-") 

     if (opp in Listadd): 
      str1 = str1.replace(opp ,"+") 

     if (opp in Listopp): 
      pass 

     math = eval(str1) 
     if not float(math).is_integer(): 
      print "rounded" 
      result = round(math, 3) 
     else: 
      print "real" 
      result = math 
     print result 
    else: 
     print "No suitable math problems found." 
except Exception as e: 
    print e 

Любая помощь или консультации по этому коду было бы весьма признателен.

+0

Я уверен, что вы «делаете это неправильно». То, что вы описываете, является парсером выражений, и это значительно сложнее, чем поиск и замена. Например. использование pyparsing: https://pyparsing.wikispaces.com/file/view/fourFn.py – thebjorn

ответ

0

Я собираюсь проигнорировать часть вашего проекта AI, поскольку это не MCVE. Я думаю, что первая часть вашего вопроса, хотя, так что я покажу вам, как найти элемент и индекс, где элементы в списке происходят, которые удовлетворяют условие вы даете (word in str1) с помощью numpy.where:

import numpy as np 
List = ["add", "bolt", "dead", "bolter", "test"] 
str1 = "bolter" 
items = [word in str1 for word in List] 
print items 
indices = np.where(items)[0] 
print indices 

Этот фрагмент кода выведет:

[False, True, False, True, False] 
[1, 3] 

слово советы: не используйте прописную букву для переменной, как List. Я так и оставил свой ответ, потому что хотел, чтобы вы могли легко следовать моему решению. Обычно заглавные буквы обозначают имя класса, поэтому переменные заглавных букв делают ваш код более сложным для других программистов Python для чтения и понимания. Это всего лишь стилистическая норма в сообществе Python.

Надеюсь, это поможет!

0

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

>>> my_list = [4, 6, 1, 4, 1] 
>>> any(x > 4 for x in my_list) 
True 
>>> next(x for x in my_list if x > 4) 
6 
>>> next(i for i, x in enumerate(my_list) if x > 4) 
1 
>>> next(i for i, x in enumerate(my_list) if x > 6) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
>>> default = 4 
>>> next((i for i, x in enumerate(my_list) if x > 6), default) 
4 
>>> next((i for i, x in enumerate(my_list) if x > 4), default) 
1