關(guān)于Dict(),Counter()踩過的一點坑

首先上題目钻洒,題目思路很簡單,乍看一下也是很好解決锄开,但是在解題的過程中還是遇到不少坑素标,Python雖然輪子多,但是坑也不少萍悴。
這里簡單反思一下解題過程中头遭,遇到的各種各樣的坑。


The bill is represented as an array with information about the calls. Help Nicola to calculate the cost for each of Sophia calls. Each call is represented as a string with date, time and duration of the call in seconds in the follow format:
"YYYY-MM-DD hh:mm:ss duration"
The date and time in this information are the start of the call.
Space-Time Communications Co. has several rules on how to calculate the cost of calls:
First 100 (one hundred) minutes in one day are priced at 1 coin per minute;
After 100 minutes in one day, each minute costs 2 coins per minute;
All calls are rounded up to the nearest minute. For example 59 sec ≈ 1 min, 61 sec ≈ 2 min;
Calls count on the day when they began. For example if a call was started 2014-01-01 23:59:59, then it counted to 2014-01-01;
For example:
2014-01-01 01:12:13 181
2014-01-02 20:11:10 600
2014-01-03 01:12:13 6009
2014-01-03 12:13:55 200
First day -- 181s≈4m -- 4 coins;
Second day -- 600s=10m -- 10 coins;
Third day -- 6009s≈101m + 200s≈4m -- 100 + 5 * 2 = 110 coins;
Total -- 124 coins.
Input: Information about calls as a tuple of strings.
Output: The total cost as an integer.
具體題目可以參見鏈接https://py.checkio.org/zh-hans/mission/calls-home/


最常規(guī)的解法

首先癣诱,我們獲取日期信息和通話時間计维,再將相同日期的通話時間進(jìn)行累加。最簡單的想法是利用字典的鍵位的唯一性撕予,
每取到一個日期的值鲫惶,就將對應(yīng)字典的value更新即可。但是這里有一個問題:

  1. 如果字典key存在那么实抡,使用直接賦值和增量賦值(+=)都是沒有問題的欠母。
  2. 如果字典key不存在欢策,那么使用直接賦值是可行的,但是使用增量賦值就會報keyerror
    此處插入一段:
    In line with the fail-fast philosophy, dict access with d[k] raises an error when k is not an existing key. Every Pythonista
    knows that d.get(k, default) is an alternative to d[k] whenever a default value is more convenient than handling KeyError.
    那么如果使字典也能實現(xiàn)不存在key值的時候進(jìn)行增量賦值呢赏淌,這里可以使用dict.get(value,default=None)方法來實現(xiàn)踩寇,
    該方法返回指定鍵的值,如果值不在字典中返回default值六水。由此可以得到以下第一種解法
from math import ceil
def total_cost(calls):
  dict = {}
  for call in calls:
    date, _, length = call.split(" ")
    dict[date] = dict.get(date,0) + ceil(int(length)/60)
  return sum([i*2-100 if i>100 else i for i in dict.values()]) 

使用Built-in函數(shù)Counter()的解法

Counter()是collections下面的一個計數(shù)器函數(shù)俺孙。有興趣的可以去看看Counter()的源碼,Counter()繼承dict類缩擂,因此我們可以使用dict的方法來使用counter().因為 Counter 實現(xiàn)了defaultdict()的__missing__ 方法鼠冕, 所以當(dāng)訪問不存在的key的時候,返回值為0胯盯。利用這個特性懈费,我們就可以無憂慮的使用增量賦值來達(dá)成我們的目的。

from math import ceil
from collections import Counter
def total_cost(calls):
  dict_total = Counter()
  for call in calls:
    date, _, length = call.split(" ")
    dict_total[date] += ceil(int(length)/60)
  return return sum([i*2-100 if i>100 else i for i in dict_total.values()])

當(dāng)然你也可以使用counter().update方法博脑,把所有的值放在一個可迭代對象中憎乙,然后傳入update()函數(shù)進(jìn)行更新,此處為了簡單叉趣,就直接用了增量賦值

使用defaultdict()的解法

其實上一種方法中用counter()屬于大材小用泞边,我們需要的只是實現(xiàn)了__missing__方法的dict類即可,在這里我們可以調(diào)用collections模塊下的defaultdict()方法來幫助我們完成疗杉。
實現(xiàn)原理阵谚,defaultdict()在實例化的時候,需要傳入一個可調(diào)用對象烟具,這個可調(diào)用對象在__getitem__方法找不到鍵的時候被調(diào)用梢什,讓__getitem__方法返回某種默認(rèn)值

from collections import defaultdict
from math import ceil
def total_cost(calls):
  dict1 = defaultdict(int)
  for call in calls:
    date, _, length = call.split(" ")
    dict1[date] += ceil(int(length)/60)
  return sum([i*2-100 if i>100 else i for i in dict1.values()])

此處直接傳入Int作為可調(diào)用對象是可行的,就是代碼有點丑朝聋,以后學(xué)了更加pythonic的寫法后再回來更新嗡午。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市冀痕,隨后出現(xiàn)的幾起案子荔睹,更是在濱河造成了極大的恐慌,老刑警劉巖言蛇,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僻他,死亡現(xiàn)場離奇詭異,居然都是意外死亡腊尚,警方通過查閱死者的電腦和手機吨拗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丢胚,你說我怎么就攤上這事∈馨猓” “怎么了携龟?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長勘高。 經(jīng)常有香客問我峡蟋,道長,這世上最難降的妖魔是什么华望? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任蕊蝗,我火速辦了婚禮,結(jié)果婚禮上赖舟,老公的妹妹穿的比我還像新娘蓬戚。我一直安慰自己,他們只是感情好宾抓,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布子漩。 她就那樣靜靜地躺著,像睡著了一般石洗。 火紅的嫁衣襯著肌膚如雪幢泼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天讲衫,我揣著相機與錄音缕棵,去河邊找鬼。 笑死涉兽,一個胖子當(dāng)著我的面吹牛招驴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播花椭,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼忽匈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矿辽?” 一聲冷哼從身側(cè)響起丹允,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袋倔,沒想到半個月后雕蔽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡宾娜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年批狐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡嚣艇,死狀恐怖承冰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情食零,我是刑警寧澤困乒,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站贰谣,受9級特大地震影響娜搂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吱抚,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一百宇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秘豹,春花似錦携御、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岸更,卻和暖如春鸵膏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怎炊。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工谭企, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人评肆。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓债查,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓜挽。 傳聞我的和親對象是個殘疾皇子盹廷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 讀完了老貓在《貓說》上的所有文章俄占,其中《一切才剛剛開始》這篇無疑屬于最上乘的作品之一。 如果想和剛進(jìn)入幣圈的朋友講...
    計然閱讀 297評論 0 6
  • 結(jié)束了寧波之行淆衷,現(xiàn)在的正在回武漢的動車上缸榄。自我離開你之后,心里真的很壓抑祝拯,你還是那么的“默默無聞”甚带,真心的,把你丟...
    藍(lán)色深晨閱讀 550評論 0 0
  • 他遇見她,也是在這樣的季節(jié)鹰贵。 四月的鎮(zhèn)江晴氨,行人換上了夏裝,柳絮漫天惹人嫌碉输。 那天瑞筐,他坐公交去見一位老朋友。說是老朋...
    greatso閱讀 6,085評論 0 7