Python:如何在字典中达到特定键之前获取所有值的总和

时间:2014-07-26 05:22:58

标签: python python-2.7 dictionary

我是python的新手,对字典操作有疑问。
我按照以下方式维护字典 -

 dict = {counter:distance}.

例如 -

 dict = {1:1, 2:10, 3:27, 4:10, 5:7, 6:10}

对于给定的密钥,我希望找到到达该密钥的总距离。
对于给定的密钥= 5,返回的总距离应为(1+10+27+10) = 48.

我想出了一个简单的解决方案 -

input_key = raw_input()
dist = 0
for key,value in dict:
if key == input_key
    break
else
    dist += value
return dist

我正在寻找一些可用于实现此目的的内置函数或库。

我的要求是我将数据写入输出文件。 格式如下 - docid \ t termid \ t number 100 \ t2943 \ T3

我有for循环,它运行在每个docid和termid上。 Termid可以在循环中重复,在这种情况下我需要修改输出文件中的行。因此,如果再次使用数字58作为docid 100和termid 2943,那么上面的行需要更改为 - 100 \ t2943 \ T3 \ T58

这样,输出文件中的同一行可以根据docid和termid多次修改。

我希望减少在输出文件中搜索'^ docid \ ttermid'模式所花费的时间,然后修改该行。因此我计划维护一个应该在输出文件中保持偏移量的字典。 这样我就可以遍历字典并在文件中获取偏移量,读取行并修改它。

6 个答案:

答案 0 :(得分:4)

字典不是有序映射。您需要使用其他序列数据结构,或collections.OrderedDict如果您想要映射。

而且,迭代字典不会产生键值对,而是键。

以下是使用itertools.takewhile的解决方案:

>>> import itertools
>>> from collections import OrderedDict
>>>
>>> d = OrderedDict([(1,1), (2,10), (3,27), (4,10), (5,7), (6,10)])
>>> print sum(map(d.get, itertools.takewhile(lambda key: key != 5, d)))
48

答案 1 :(得分:2)

使用dict无法完成您想要做的事情,并获得可重复的答案。 Python词典是无序的。您将在Python实现中获得任意答案。

根据您使用的Python版本,您可以使用OrderedDict

答案 2 :(得分:0)

也许是这样的:

input_key = int(raw_input())

dist = sum(dict[i] for i in xrange(1, input_key))

例如:

>>> dict = {1:1, 2:10, 3:27, 4:10, 5:7, 6:10}
>>> sum(dict[i] for i in xrange(1, 5))
48

请注意,您提供的代码将无法一致地工作,因为在字典对象中未定义键排序;键值对可以在任何顺序中迭代。这个答案中的代码将反而遍历数字1到input_key - 1,将这些键中存储在字典中的值相加。

答案 3 :(得分:0)

您需要做的第一件事是订购dict,您可以使用OrderedDict

来执行此操作

以下是一个例子:

import collections
input_key = int(raw_input()) # In this example I suppose is 5
dict = {1:1, 2:10, 3:27, 4:10, 5:7, 6:10}
od = collections.OrderedDict(sorted(dict.items()))
In: sum(od[m] for m in filter(lambda x: x<input_key, od))
Out: 48

答案 4 :(得分:0)

>>> from operator import itemgetter
>>> d = {1:1, 2:10, 3:27, 4:10, 5:7, 6:10}
>>> sum((x[1] for x in sorted(d.items(), key=itemgetter(0)) if x[0] < 5))
48

备注:

  • dict(s)不是有序的数据结构。
  • sorted.items()用于为我们提供有序的(count, distance)
  • 序列
  • 这是一个生成器表达式,最终使用sum()消耗。
  • 最好在此使用list tuple个。例如:[(1, 1), (2, 10), ...]

作为一项功能:

def distance(d, k):
    return sum((x[1] for x in sorted(d.items(), key=itemgetter(0)) if x[0] < k))

答案 5 :(得分:0)

如果数据结构中缺少键,则可以使用defaultdict(否则,使用列表,正如其他人已经建议的那样)。

from collections import defaultdict
data = defaultdict({ ... }, lambda: 0)

def dist_until(i, data):
    return sum(data[j] for j in range(1, i))

另外,请避免命名变量dict