2010-10-01 153 views
0

我有一本字典和一个列表。该列表由值组成。字典包含所有的值和更多的值。快速搜索python列表?

我想计算列表中的值显示在字典中的每个键/值对的次数。

它看起来是这样的:

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

我在列表像约1万个条目,以便通过每次搜索是超慢。

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

感谢, 罗汉

+2

我愿意成为这是作业。在对频率进行任何查找之前,在计算列表中所有频率的成本时,这是非常优秀的练习。 – 2010-10-01 20:35:43

+0

您将需要提供您正在使用的代码: 由于此代码看起来有问题:对于k中的a:k的类型将取决于字典中键的类型。你也在使用list [k],它表示k上有一个约束是int型的,所以它可以是一个索引。也没有检查IndexError:列表索引超出范围。你能对你的代码更具体吗? – pyfunc 2010-10-01 20:39:54

+0

我不明白这段代码的最后一行应该做什么。 – 2010-10-01 20:40:23

回答

2

由于您既要从列表中删除项目,又要在其中使用索引,因此您将遇到此代码的所有问题。另外,您正在使用list作为变量名称,因为list也是一种类型,这会使您陷入有趣的麻烦中。

通过使用集合而不是列表,您应该能够获得巨大的性能改进(一旦您修复了代码中的其他缺陷)。使用集合失去的东西是项目的排序和使项目不止一次出现在列表中的能力。 (你的物品也必须是可散列的。)你获得的是O(1)查找时间。

0
for val in my_list: 
    if val in my_dict: 
     my_dict[val] = my_dict[val] + 1 
    else: 
     my_dict[val] = 0 

什么,你仍然需要

  • 手柄情况下VAL是不是在字典
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 
+1

稍好一点,比较合适的是将其转换为一个字典而不是字典 – Javier 2010-10-01 20:53:51

+0

您是对的,它会更合适。 – eumiro 2010-10-01 21:00:46

0

我改变了最后一行以追加到字典。这是一个defaultdict(列表)。希望能澄清一些问题。再次感谢。

+1

通过点击问题中标签下方的“编辑”,让您自己编辑。 – Pupil 2010-10-01 21:04:43