Python:如何在列表列表中“找到”某些内容

时间:2015-07-01 19:14:05

标签: python list search find

在Python中,你可以这样做:

L=["John","David","Susan"]
x = "John"
if x in L:
    print(L.index(x))

如果我有这样的列表怎么办:

L = [["John", 1234, "California"], ["David", 5678, "Arizona"], ["Susan", 8765, "Nevada"]]

我希望搜索名称“John”并查找状态和ID号而不迭代列表中的所有元素?我想要的是,是否有类似“L中的{if}”的东西。

我想它会像记录搜索功能一样。我有一个列表列表,这些元素是固定长度列表(或元组),我想知道在Python中是否有O(1)类型的搜索功能,或者我可以轻松实现的能够执行一步搜索(假设是O(N),它要求迭代列表中的所有元素)

4 个答案:

答案 0 :(得分:2)

您应该创建并使用字典。

L = [["John", 1234, "California"], ["David", 5678, "Arizona"], ["Susan", 8765, "Nevada"]]
D = {name:(number, state) for name, number, state in L}

这样可以轻松查找:

>>> D.get("John", 'no')
(1234, 'California')
>>> D.get("Jim", 'no')
'no'

答案 1 :(得分:1)

您可以制作嵌套词典

>>> d = {i[0]:{'ID':i[1], 'State':i[2]} for i in L}
>>> d
{'Susan': {'ID': 8765, 'State': 'Nevada'},
 'John': {'ID': 1234, 'State': 'California'},
 'David': {'ID': 5678, 'State': 'Arizona'}}

然后查找像

这样的人
>>> d['John']
{'ID': 1234, 'State': 'California'}
>>> d['John']['State']
'California'

答案 2 :(得分:0)

您可以将列表转换为canada或使用哈希表的字典,并且它们具有用于检查成员资格的订单O(1)。但这种转换是O(n)或更多。你也会浪费更多的记忆!

但作为一种有效且直接的方式,我建议在set函数中使用生成器表达式:

next

请注意,使用生成器可能在时间方面效率不高,但在内存中效率很高!当你处理长名单时,你可以节省大量的内存!

答案 3 :(得分:0)

如果L必须是列表列表,您可以随时自行创建。

def find(value,matrix):
    for list in matrix:
        if value in list:
            return [matrix.index(list),list.index(value)]
    return -1

然后,如果你说

L = [["John", 1234, "California"], ["David", 5678, "Arizona"], ["Susan",  8765, "Nevada"]]
x = "John"
if find(x,L) != -1:
    print(find(x,L))

它应该打印[0,0]

这会回答你的问题吗?