Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在列表中查找项目_Python_List_Parsing - Fatal编程技术网

Python 在列表中查找项目

Python 在列表中查找项目,python,list,parsing,Python,List,Parsing,所以我试图在python的列表中找到一个项。以下是我的功能: def operator(input): operatorlist = ['+', '-', '*', '/', '^', 'sin', 'cos'] for i in operatorlist: if input is operatorlist[i]: return True 我的密码坏了,我不知道为什么。。。有什么想法吗 我将代码更改为: def operator(inp

所以我试图在python的列表中找到一个项。以下是我的功能:

def operator(input):
    operatorlist = ['+', '-', '*', '/', '^', 'sin', 'cos']

    for i in operatorlist:
        if input is operatorlist[i]:
            return True
我的密码坏了,我不知道为什么。。。有什么想法吗

我将代码更改为:

def operator(input):
    if input is '+' or input is '-' or input is '*' or input is '/' or input is '^' or input is 'sin' or input is 'cos':
    return True

因为有人告诉我,从本质上讲,这样写在文体上是愚蠢的。

将运算符列表中I的
更改为范围内I的
(len(运算符列表))

当您只是在operatorlist中请求
i
时,在每次迭代中
i
实际上将是该条目的元素,而不是索引。或者,您可以重新设置循环体的格式,以反映
i
是一个实际的字符串,其中包含有问题的运算符,而不是索引

这里有几件事:

  • 函数定义行需要以冒号结尾
  • 缩进很重要
  • 你几乎从来都不想用“是”
  • 您可以检查对象是否在列表中,而无需使用“in”操作符显式循环
  • 如果你没有找到你要找的东西,你可能应该返回False;大多数情况下,您都会侥幸逃脱,因为如果您不显式返回,函数将不返回任何值,并且“无”不是“真实的”
因此,请尝试:

def operator(input):
    operatorlist = ['+', '-', '*', '/', '^', 'sin', 'cos']

    if input in operatorList:
        return True

    return False
或者更简洁地说:

def operator(input):
    operatorlist = ['+', '-', '*', '/', '^', 'sin', 'cos']
    return input in operatorList

操作符中使用

return (input in operatorlist)
(括号是不必要的,为了更清楚,我加入了括号。)


您可能需要通过或a开始使用Python。

for i in operatorlist
不会运行operatorlist的索引,而是运行实际的元素。因此
i
将在第一个循环中是
'+'
,在第二个循环中是
'-'
,依此类推

所以这个
如果输入是运算符list[i]
应该类似于
如果输入是i

最后,实际上,整个函数可以被运算符列表中的逻辑运算
输入所取代。所以你可以这样做:

def operator(input):
    return input in ('+', '-', '*', '/', '^', 'sin', 'cos')
一行:

return input in operatorlist
无需在此处执行条件,in运算符已返回布尔值

def operator(x):
    return x in {'+', '-', '*', '/', '^', 'sin', 'cos'}
不过,您可能希望避免为每个函数调用创建新的集合,在这种情况下,您可以

def operator_check(*operators):
    operators = set(operators)
    def checker(x):
        return x in operators
    return checker

math_operator = operator_check('+', '/', '*', '^', '-')

if math_operator('+'):
    print "it's a math operator!"

或者更好的做法是,将operatorlist中的item的循环更改为
,并完全放弃索引操作。@EMS-Python中有一些公认的习惯用法,它们被接受是有充分理由的。如果愿意,您可以使用FORTRAN或C风格的习惯用法编写Python,但您的代码将过于臃肿和缓慢。当真正的目标是迭代列表的项目时,按索引迭代列表是浪费的,实际上,这是初学者的标志<代码>对于序列中的项:
避免计算序列的长度,并创建一个额外的范围(如果您仍在使用Python 2.x,则创建一个完整的列表索引列表),并且实际上只是减少了以后需要消化的语法。在这种特殊情况下(教初学者),使用pythonic习语非常重要。如果你知道这些规则并且有充分的理由,你可以违反这些规则,但这里的情况都不是这样。规则的存在是为了使每个人的代码看起来相似(应该只有一种方法)。遵循它们会使所有遵循它们的代码更具可读性,最终更易于维护。也许在科学界是不行的,但要准备好面对那些因为你没有充分理由就打破它们而对你大喊大叫的人。叫喊者在捍卫生态系统,让他们更容易接管别人的代码。@Adam,我不同意。我的经验是,在90%以上的现实生活中,用于科学计算的Python不应该与用于其他目的的Python相似。见例。唯一需要注意的是从文件中读取和操作数据时。我经常在执行该任务时使用Python惯用语,并且仅在执行该任务时使用Python惯用语。作为一名科学计算研究生、雷达分析员和我目前的工作,这是正确的。@EMS如果您想在回答中使用适合科学计算的风格,请回答有关科学计算的问题。你不会用Python代码回答Java问题,那么为什么要用一种在科学计算中使用但在其他地方没有使用的Python风格来回答一个通用Python问题呢?使用
is
进行比较没有什么错。您建议的更改并没有解决上述用户看到错误的原因,这与变量
i
的使用方式有关。它被指定为列表中的一个元素,但随后被视为一个索引。@EMS:使用
is
比较字符串是有好处的。此外,用
for
循环代替
中的
只是无缘无故地增加了复杂性和开销。科学算法通常必须用for循环来编写,特别是为了让代码的读者能够将您所做的与已知算法相匹配。事实上,在我做的大多数日常工作中,如果。。。在…
中。您的方法对于这个与预先指定的列表中的元素进行匹配的示例是绝对有效的,但更重要的一点是,有很多原因可以避免Pythonic速记,在回答中记录这些备选方案也很重要。如果你真的想通过身份和价值来测试同一个对象,那么只使用
is
。不幸的是,CPython实习短字符串,因此
's
通常会返回True,因此许多初学者养成了使用
is
比较字符串的坏习惯。因为
'012345'[0]是'0'
计算结果为真,所以他们会被吸引,然后会对错误感到惊讶,因为
'012345'[0:3]是'012'
计算结果为假。语言规范不能保证这一点,Jython和PyPy的行为也不一样。为什么不使用集合而不是列表呢?