簡體   English   中英

Python:如何在字典中達到特定鍵之前獲取所有值的總和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM