如果只给定子列表的一个元素,那么在列表中查找元素索引的最有效方法是什么(Python)

如果只给定子列表的一个元素,那么在列表中查找元素索引的最有效方法是什么(Python),python,list,python-2.7,indexing,nested-lists,Python,List,Python 2.7,Indexing,Nested Lists,也就是说,是否存在如下情况 lst = [["a", "b", "c"], [4,5,6],"test"] print getIndex(lst, "a") >>> 0 print getIndex(lst, 5) >>> 1 print getIndex(lst, "test") >>> 2 我知道正则index()方法,但它只查找立即数元素。我有一个粗略的解决方案,制作一个新的列表,通过超级列表解析并添加“y”或“n”,然后在其中查找“

也就是说,是否存在如下情况

lst = [["a", "b", "c"], [4,5,6],"test"]
print getIndex(lst, "a")
>>> 0
print getIndex(lst, 5)
>>> 1
print getIndex(lst, "test")
>>> 2
我知道正则index()方法,但它只查找立即数元素。我有一个粗略的解决方案,制作一个新的列表,通过超级列表解析并添加“y”或“n”,然后在其中查找“y”的索引,但我觉得有更好的方法。谢谢使用发电机

def getIndex(lst,item):
    for n,i in enumerate(lst):
        if (type(i) == list and item in i) or i == item
            return n
getIndex(lst,'test')
>>> 2
e、 g.在>=Python 2.6中,如果您知道该项存在于子列表中:

idx = next(i for i,v in enumerate(lst) if item in v)

请尝试使用默认函数添加到列表:

这是一个问题。它假定主列表元素仅为列表或字符串。如果在主列表中有另一种类型的列表中进行搜索,则搜索失败(操作中的
会引发
类型错误
)。例如:

要解决此问题,请执行以下操作:

def getIndex2(lst, item):
    for n, i in enumerate(lst):
        try:
            if item == i or item in i:
                return n
        except TypeError:
            pass
    return None
现在:

有几种方法可以完成“等于或等于”测试。这个解决方案通过使用“获取宽恕而不是许可”的习惯用法来捕捉
i
上的
中的
不适合键入的时间。也可以在
in
操作之前测试
i
的类型,或者直接询问
i
是否支持in操作。但是直接类型检查通常是不受欢迎的,Python中的字符串和容器具有一些复杂的重叠功能。“获得宽恕”的方法优雅地处理了那些更简单的问题

注意,这也显式地处理找不到值的情况

>>> print getIndex2(lst2, 333)
None
虽然不返回值的函数隐式返回
None
,但最好明确此类默认情况


到目前为止,这种方法处理两个级别。如果列表可以任意嵌套,则需要一种可能涉及递归的不同方法。

不,没有内置的方法。编写函数并不困难,例如使用递归。但这是家庭作业吗?不是。我刚得到一份需要大量Python的新工作,我正在努力边干边学。
getIndex([[“a”,“b”,“c”],[4,5,6],“test”,19],19)
引发了一个
TypeError
我们需要一些检查,比如
if(type(I)=list and item in I)或I==item
这对@Jonathan Eunice显示的情况不起作用。实际上,它通过了@JonathanEunices解决方案中的测试,因为生成器在到达
19
之前停止。但是,如果原始文件中有随机的非列表要忽略,则可以将我的解决方案修改为
idx=next(i代表i,v在枚举(lst2)中,如果hasattr(v,“\uu包含”和v中的项)
idx=next(i代表i,v在枚举(lst2)中,如果存在(v,list)和v中的项)
如果将搜索目标设置为
item=19
,它仍会抛出
类型错误,否?原始问题没有指定外部列表应包含字符串或列表之外的元素。要求每个列表项都有一个
\uuuuu contains\uuuu
方法就足以处理
lst
项是整数的情况。原始问题指定“…仅给定子列表的一个元素”,这足以假设所有列表项也是列表(或字符串,在原始示例中)。此外,由于
运算符中字符串和容器的奇数重叠,该算法也存在一些退化情况。它们很容易识别和严格测试,但会使代码更加复杂。
def getIndex2(lst, item):
    for n, i in enumerate(lst):
        try:
            if item == i or item in i:
                return n
        except TypeError:
            pass
    return None
>>> getIndex2(lst2, "test")
2
>>> getIndex2(lst2, 19)
3
>>> print getIndex2(lst2, 333)
None