【问题标题】:Python: how to 'find' something in a list of listsPython:如何在列表列表中“查找”某些内容
【发布时间】:2015-09-19 02:37:30
【问题描述】:

在 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 号而不遍历列表的所有元素?我要寻找的是是否有类似于“if {something} in L”的东西。

我猜它会像一个记录搜索功能。我有一个列表列表,元素是固定长度列表(或元组),我想看看 Python 中是否有 O(1) 类型的搜索功能,或者我可以轻松实现的东西一步搜索(假设为 O(N),需要遍历列表中的所有元素)

【问题讨论】:

  • 要明确一点 - if x in L 其中L 是一个列表仍然是 O(N)

标签: python list search find


【解决方案1】:

如果 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]

这能回答你的问题吗?

【讨论】:

    【解决方案2】:

    您可以将您的列表转换为set 或使用哈希表的字典,并且它们具有 O(1) 的顺序来检查成员资格。但是这种转换是 O(n) 或更多。而且你会浪费更多的内存!

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

    >>> next((j,k) for i,j,k in L if i=='John')
    (1234, 'California')
    

    请注意,使用生成器在时间方面可能效率不高,但在内存方面却很有效!当你处理长列表时,你可以节省很多内存!

    【讨论】:

      【解决方案3】:

      您应该创建并使用字典。

      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'
      

      【讨论】:

      • 如果有两个“John”怎么办?:
      • 然后您可以将值存储在list 中,显示为{"John":[(1234, 'California'), (3141, "Canada")], "David":...},然后搜索给定键的值。除非您的数据库非常不平衡(例如,10,000 人名为“John”,一个人名为“Susan”),否则这仍然很快。
      • 谢谢。我想我最喜欢这个解决方案!
      【解决方案4】:

      你可以制作嵌套字典

      >>> 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'
      

      【讨论】:

      • 或者一般树def tree(): return defaultdict(tree)
      猜你喜欢
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多