在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),它要求迭代列表中的所有元素)
答案 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]
这会回答你的问题吗?