我是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'模式所花费的时间,然后修改该行。因此我计划维护一个应该在输出文件中保持偏移量的字典。 这样我就可以遍历字典并在文件中获取偏移量,读取行并修改它。
答案 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
。