[英]Python : How to get sum of all values until a specific key is reached in 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'模式所花費的時間,然后修改該行。 因此我計划維護一個應該在輸出文件中保持偏移量的字典。 這樣我就可以遍歷字典並獲取文件中的偏移量,讀取行並修改相同的內容。
字典不是有序映射。 如果要進行映射,則需要使用其他序列數據結構或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
你想做什么不能用dict完成並獲得可重復的答案。 Python詞典是無序的。 您將在Python實現中獲得任意答案。
根據您使用的Python版本,您可以使用OrderedDict 。
也許是這樣的:
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,將存儲在字典中的值與這些鍵相加。
你需要做的第一件事是訂購你可以用OrderedDict做的dict
這是一個例子:
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
>>> 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()
消耗。 tuple
list
。 例如: [(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))
如果數據結構中缺少鍵,則可以使用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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.