【问题标题】:Searching a python list quickly?快速搜索 python 列表?
【发布时间】:2010-10-01 20:31:40
【问题描述】:

我有一本字典和一个列表。该列表由值组成。字典包含所有值以及更多值。

我正在尝试计算列表中的值出现在字典中每个键/值对的次数。

看起来像这样:

for k in dict:
 count = 0
 for value in dict[k]:
  if value in list:
   count += 1
   list.remove(value)
 dict[k].append(count)

我的列表中有大约 100 万个条目,因此每次搜索都非常慢。

有没有更快的方法来做我想做的事情?

谢谢, 罗汉

【问题讨论】:

  • 我愿意这是作业。这是一个非常好的练习,可以在对频率进行任何查找之前摊销计算列表中所有频率的成本。
  • 您需要提供您正在使用的代码:因为此代码似乎有问题:for k in a: k 的类型将取决于字典中键的类型。您还使用 list[k] ,这表明 k 的类型为 int 有一个约束,因此它可以是一个索引。也没有检查 IndexError: list index out of range。您能更具体地说明您的代码吗?
  • 我不明白这段代码的最后一行应该做什么。
  • 您要删除的数据集大小是多少?

标签: python list dictionary


【解决方案1】:

您将在使用此代码时遇到各种麻烦,因为您既要从列表中删除项目,又要在其中使用索引。此外,您使用list 作为变量名,这会给您带来有趣的麻烦,因为list 也是一种类型。

通过使用集合而不是列表,您应该能够获得巨大的性能提升(一旦您修复了代码中的其他缺陷)。使用集合失去的是项目的排序以及让项目多次出现在列表中的能力。 (此外,您的项目必须是可散列的。)您获得的是 O(1) 查找时间。

【讨论】:

    【解决方案2】:

    如果你在一个列表中搜索,然后将此列表转换为一个集合,它会快得多:

    listSet = set(list)
    
    for k, values in dict.iteritems():
        count = 0
        for value in values:
            if value in listSet:
                count += 1
                listSet.remove(value)
        dict[k].append(count)
    
    list = [elem for elem in list if elem in listSet]
    # return the original list without removed elements
    

    【讨论】:

    • 稍微更好更合适的是转换为集合而不是字典
    【解决方案3】:
    for val in my_list:
       if val in my_dict:
          my_dict[val] = my_dict[val] + 1
       else:
          my_dict[val] = 0
    

    你还需要什么

    • 当 val 不在字典中时处理大小写

    【讨论】:

      【解决方案4】:

      我更改了最后一行以追加到字典中。这是一个默认字典(列表)。希望这能解决一些问题。再次感谢。

      【讨论】:

      • 点击您问题中标签下方的edit,对您的编辑提出质疑。
      猜你喜欢
      • 2020-09-23
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 2016-11-20
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多