2016-05-07 3 views
-3

問題:文字列内の単語を使用してリスト内のアイテムを特定し、アイテムを識別したりインデックスを返します。文字列内の単語を使用してリスト内のアイテムを特定し、アイテムを特定する

こんにちは、このサイトと他のサイトを検索して、問題の解決策を探しています。私が見つけた解決策は、リストは、文字列内のアイテムを持っているかどうかを判断することに成功している、

例:

any(word in str1 for word in List) 

しかし、これはtrueまたはfalseを返し、およびコマンドで、

print word 

私はリスト項目を探し、いずれかの項目を印刷したり、リスト内のインデックスを与えることができるソリューションを必要とエラー

を返します。

私はこれをAIとして使用していますが、これは数学の方程式を実行する能力があります。このためには、標準の "+、 - 、*、/"だけでなく単語の形式でもある演算子を見つける必要があります。たとえば、「プラス、マイナスなど」は、見つかった場合、プログラムは文字列内の項目を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ではありません。私はあなたの質問の最初の部分はしかし、だと思うので、私は、リスト内の項目は、それがnumpy.whereを使用してあなたが与える条件(word in str1)を満たす起こる項目や指標を見つける方法を紹介します:

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()を使用できます。最初の引数はイテレータであり、2番目(オプション)の引数はイテレータがすでに使い果たされている場合のデフォルト値です。以下は、next()のさまざまな使い方を示すPythonセッションです。

>>> 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 
関連する問題