如果只给定子列表的一个元素,那么在列表中查找元素索引的最有效方法是什么(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