Python:嵌套列表中元素的索引列表

aqu*_*fan 10 python indexing nested list

我知道我在找什么.我想让python告诉我它在哪个列表中.

这是一些伪代码:

item = "a"

nested_list = [["a", "b"], ["c", "d"]]

list.index(item) #obviously this doesn't work
Run Code Online (Sandbox Code Playgroud)

在这里我希望python返回0(因为"a"是较大列表中第一个子列表中的元素).我不关心它是哪个子元素.我不在乎是否有重复,例如,["a","b","a"]应返回与上述示例相同的内容.

Ale*_*lli 12

在Python 2.6或更高版本中,

next((i for i, sublist in enumerate(nested_list) if "a" in sublist), -1)
Run Code Online (Sandbox Code Playgroud)

假设您想要一个-1结果,如果'a'没有任何一个子列表.

当然它也可以在旧版本的Python中完成,但不是很方便,因为你没有指定你感兴趣的Python版本,我认为最好使用最新的生产版本(只是如果您需要指定其他旧版本的Python,请编辑您的答案.

编辑:根据请求,让我试着解释一下这是如何工作的.我使用(新的2.6)内置函数未来,特别是我打电话next(iterator, default):返回迭代器的下一个项目(因此第一,因为这是我们推进这个迭代第一次),或迭代器完成后的默认值(如果在我们提前它之前完成它意味着"空";-).默认情况下很明显,-1如果" a没有子列表中存在",则返回,这意味着在这种情况下"迭代器为空".

让我们再看一下迭代器:

(i for i, sublist in enumerate(nested_list) if "a" in sublist)
Run Code Online (Sandbox Code Playgroud)

的(四舍五入)括号和forif关键字的意思是这是一个发电机表达,也称为为了简洁作为genexp. i(索引)和sublist(该索引处的项目)超前enumerate(nested_list)- 如果我们没有enumerate这里,那么我们就不会跟踪索引,但在这种情况下我们确实需要它.只有在if满足子句时才会考虑它们,也就是说,当您要查找的元素出现在当前子列表中时.

因此,这个genexp一次一个地产生索引的每个值,使得该索引处的子列表满足条件"a" in sublist.由于我们在里面使用它next,我们只采用第一个这样的索引.

OP可能有理由认为以三到四个字符完成所有这一切的神奇内置会更方便 - 因此,对于这个非常具体的要求,我认为我在十多年之前从未见过它.使用Python; 但是,如果每个这样的特定要求都有自己非常专业的内置语言,那么内部增长将大于税码.相反,Python提供了许多较低级别的"乐高积木"和一些方便的方式将它们拼接在一起,以明确(并且合理地简明地)表达解决方案,以满足组合的各种特定要求,如OP.


syk*_*ora 1

您需要使用某种循环结构:

next((sublist for sublist in mainlist if item in sublist))
Run Code Online (Sandbox Code Playgroud)

这将为您提供包含所需项目的所有子列表的生成器,并为您提供第一个。