Python最有效的搜索列表方式

时间:2010-12-10 19:22:16

标签: python

请耐心等待我,因为我对Python很陌生。基本上我正在寻找一种最有效的搜索多维列表的方法。所以说我有以下清单:

fruit = [
    [banana, 6],
    [apple, 5],
    [banana, 9],
    [apple, 10],
    [pear, 2],
   ]

我希望我的功能产生结果:Apple:15,Banana:15,Pear 2.最有效的方法是什么?

5 个答案:

答案 0 :(得分:9)

这绝不是一个搜索...

你想要的是

import collections

def count(items):
    data = collections.defaultdict(int)
    for kind, count in items:
        data[kind] += count
    return data

答案 1 :(得分:3)

fruit = [['banana', 6], ['apple',5], ['banana',9],['apple',10],['pear',2]]
f = {}

def fruit_count():
    for x in fruit:
    if x[0] not in f.keys():
            f.update({x[0]:x[1]})
    else:
            t = f.get(x[0])
            t = t + x[1]
            f.update({x[0]:t})

    return f
f = {'apple': 15, 'banana': 15, 'pear': 2}

答案 2 :(得分:1)

使用collections.defaultdict累积,并遍历列表。

accum = collections.defaultdict(int)
for e in fruit:
  accum[e[0]] += e[1]

答案 3 :(得分:0)

myHash = {}

fruit = [
    [banana, 6],
    [apple, 5],
    [banana, 9],
    [apple, 10],
    [pear, 2],
   ]

for i in fruit:
   if not i[0] in myHash.keys():
      myHash[i[0]] = 0
   myHash[i[0]] += i[1]

for i in myHash:
   print i, myHash[i]

将返回

apple 15
banana 15
pear 2

修改

我不知道python中的defaultdict。这是一个更好的方法。

答案 4 :(得分:0)

我不确定applebanana是什么类型,因此我只将它们作为空类并使用它们的类名进行识别。解决此问题的一种方法是使用字典方法setdefault(),它首先检查给定的键是否已经在字典中,如果它只是返回它,但如果不是,则将其插入默认值返回之前的值。

为了通过避免多个字典键查找来更有效地使用它来解决这个问题,与每个键相关联的计数需要存储在“可变”或可更改的内容中,因为简单的整数不在Python中。诀窍是将数字计数存储在可以更改的单元素list中。下面代码中的第一个函数显示了如何做到这一点。

请注意,标准库中的Python collections模块中有一个名为defaultdict的字典子类,可以使用它而不是每当有效地执行setdefault()操作时首先访问不存在的密钥。它还使得将计数存储在列表中以提高效率,并将其更新稍微简单一些。

在Python 2.7中,另一个字典子类被添加到名为collections的{​​{1}}模块中。使用它可能是最好的解决方案,因为它专为这种应用而设计。下面的代码显示了如何以三种方式执行此操作(并对创建的总计列表进行排序)。

counter