2017-08-19 73 views
0

我有一个列表的列表,我需要获取该元素的索引。在列表中搜索元素的索引

假设我有一个列表[[0,0,0,'P'],[0,0,0,0],[0,'Q',0,0],[0,0,0,0]]

如何得到'P''Q'的索引,如果只有一个'P'和一个'Q'

我想:list.index('P')

,但得到ValueError: 'P' is not in list

回答

1

您可以使用列表中理解和enumerate每次迭代:

l = [[0,0,0,'P'],[0,0,0,0],[0,'Q',0,0],[0,0,0,0]] 

indexes = [[i for i, a in enumerate(b) if a == "P" or a == "Q"] for b in l] 

您还可以使用存储的信字典和一与子列表索引和子列表中的字母索引相对应的列表:

new_dict = [{a:[i, b] for b, a in enumerate(c) if a == "P" or a == "Q"} for i, c in enumerate(l)] 

new_dict = [i for i in new_dict if i] 

final_dict = {**new_dict[0], **new_dict[1]} 
print(final_dict) 

输出:

{'Q': [2, 1], 'P': [0, 3]} 

最后,为了获得完整的子列表:

final_values = final_dict.values() 

输出:

[[2, 1], [0, 3]] 
+1

如果在列表理解之前将'“P”'和'“Q”'放在一个集合中,'如果a ==“P”或者==“Q”'可以缩写为'如果a在P_Q_set ' –

+0

'print(indexes)'给出'[[3],[],[1],[]]'作为输出,我怎样才能将它格式化为'[2,1]&[0,3] ? – kesoh

+0

@kesoh请看我最近的编辑。 – Ajax1234

0

如果您正在寻求在其元素是索引子列表,你可以试试这个:

input_list = [[0,0,0,'P'],[0,0,0,0],[0,'Q',0,0],[0,0,0,0]] 

def find_position(input_list, element): 
    index = 0 
    for sublist in input_list: 
     if element in sublist: 
      return index 
     index += 1 
    return None 

find_position(input_list, 'P') 
OUT: 0 

find_position(input_list, 'Q') 
OUT: 2 
0

这里你的搜索数组元素是它们自己的数组,所以你需要做一些工作来得到你想要的。

我会假设当搜索'P'和'Q'时,您期望得到一个元组,因为第一个值是指搜索元素出现的数组,第二个值是指向数组中出现的搜索元素。

您可以编写以下功能

def find_position(array, elem): 
    for i, arr in enumerate(array): 
     if elem in arr: 
      return (i, arr.index(elem)) 
    return (-1, -1) # elem do not exist 


find_position(l, 'Q') 
Out: (2, 1) 

find_position(l, 'P') 
Out (0, 3) 
0

你有嵌套列表搜索:

for nested_list in list: 
    if 'P' in nested_list: 
     index_of_P = nested_list.index('P') 
     break 

的解释:

index()方法引发ValueError'P'未找到在nested_list中,因此if就在其使用之前进行测试。

由于您只有一个'P',循环成功搜索后。


注:

这是一个简单的,但不建议使用。在了解例外处理后,您将看到更合适的解决方案。

+0

如果P不存在 - 为什么不只是处理抛出的异常呢?首先检查它是否意味着首先扫描列表,然后再次扫描以找到位置......如果发生异常,则证明它不存在,而如果是,则您的索引只扫描它需要去,你有索引。没有必要做更多的工作。 –

+0

@JonClements你绝对是对的,但我决定调整我对OP(假设)级别的回答,并用它的先决条件来存储单个“P”。 – MarianD

+0

公平 - 尽管在这个“层面” - 他们很可能会将建议作为福音,你需要检查存在以避免“错误”(这不是一个错误 - 只是一个异常,不一定是错误的事情),以防万一它不 - 真的没有任何人喜欢任何人。 –