002-355-Design Twitter by Python

本文例題來(lái)自355-Design Twitter

題目

355-Design Twitter

分析

本題非常貼近于程序員碼代碼的日常需求,剔除了與DB和其他接口的交互叔锐,所以唯一要考慮的就是不同的數(shù)據(jù)挪鹏,用何種數(shù)據(jù)類型來(lái)處理。
提煉題目愉烙,發(fā)現(xiàn)了至少需要如下兩個(gè)數(shù)據(jù)類型

  • 隸屬于個(gè)人的推文列表讨盒,為了方便取最新的十筆推文,使用隊(duì)列DEQUE是個(gè)好辦法步责。
  • 隸屬于個(gè)人分關(guān)注列表返顺,為了剔除重復(fù)性使用集合SET

個(gè)人的解法

無(wú)

評(píng)論的力量

評(píng)論有個(gè)解法非常優(yōu)秀禀苦,本分分析即源自此解法

關(guān)注列表用set實(shí)現(xiàn),添加和刪除都比較簡(jiǎn)單 #推文列表用list實(shí)現(xiàn)遂鹊,時(shí)間戳+推文組成元組加入列表(初始方案振乏,不行) 推文列表用雙端隊(duì)列(deque)實(shí)現(xiàn),時(shí)間戳+推文組成元組加入隊(duì)列頭 最復(fù)雜的是獲取推文秉扑,用最大堆實(shí)現(xiàn)十條推文的獲取昆码。hepq.merge可以多輸入單輸出排序,再用itertools.islice(iterable, stop) 切片邻储。
by LJ001
python

collections.defaultdict

字典dict的子類赋咽,放到面對(duì)對(duì)象來(lái)說(shuō),即繼承了字典吨娜,并實(shí)現(xiàn)了額外的方法——提供了一個(gè)工廠函數(shù)脓匿,為字典查詢提供一個(gè)默認(rèn)值。
1.何為工廠函數(shù)
這是一個(gè)面向?qū)ο缶幊痰母拍罨略嬖诘囊饬x就是當(dāng)你調(diào)用此函數(shù)時(shí)陪毡,就建立了一個(gè)對(duì)應(yīng)的對(duì)象,而這個(gè)對(duì)象的形式和你的調(diào)用函數(shù)和傳入值有關(guān)勾扭,工廠會(huì)根據(jù)你的調(diào)用生成指定的對(duì)象毡琉,而調(diào)用者無(wú)需去管理工廠里面用的哪些接口。詳細(xì)可以看設(shè)計(jì)模式——工廠模式
2.為字典查詢提供一個(gè)默認(rèn)值是什么意思
簡(jiǎn)單點(diǎn)來(lái)說(shuō)妙色,當(dāng)字典不存在此鍵值對(duì)時(shí)桅滋,defaultdict提供了初始化,并給予了默認(rèn)值身辨,最明顯的結(jié)果如下:

#!/usr/bin/python3
> d = collections.defaultdict(list)
#defaultdict(<class 'list'>, {})
> print(d)
#[]
> print(d['JACK'])
#defaultdict(<class 'list'>, {'JACK': []})
> print(d)

不需要?jiǎng)?chuàng)建即有了鍵值對(duì)丐谋。用處不言而喻,跳過(guò)了可能的存在性檢查煌珊,不存在即創(chuàng)建号俐。一定程度上代替了如下兩種方法:


dict的miss定義

dict的內(nèi)置方法setdefault

同時(shí)defaultdict還給我們提供了用lambda初始化的方法

#!/usr/bin/python3
d = collections.defaultdict(lambda : '1')

heapq.merge

堆排序算法其中之一的工具


heapq.merge

解釋下*,表示對(duì)iterable變量定義為可變變量

itertools.islice

itertools.islice

只是要注意下以上兩個(gè)函數(shù)返回的都是迭代器定庵,要獲得最終值需要用迭代器遍歷吏饿。
python果然是工具語(yǔ)言,效果顯著emoji蔬浙,不知道該說(shuō)什么好猪落。
代碼如下
by LJ001

class Twitter:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.tweets=collections.defaultdict(collections.deque)
        self.followlist=collections.defaultdict(set)
        self.timestamp=2**31
    def postTweet(self, userId, tweetId):
        """
        Compose a new tweet.
        :type userId: int
        :type tweetId: int
        :rtype: void
        """
        self.timestamp-=1
        self.tweets[userId].appendleft((self.timestamp,tweetId))
        

    def getNewsFeed(self, userId):
        """
        Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.
        :type userId: int
        :rtype: List[int]
        """
        tweets = heapq.merge(*(self.tweets[u] for u in self.followlist[userId] | {userId}))
        return [t for _, t in itertools.islice(tweets, 10)]

    def follow(self, followerId, followeeId):
        """
        Follower follows a followee. If the operation is invalid, it should be a no-op.
        :type followerId: int
        :type followeeId: int
        :rtype: void
        """
        self.followlist[followerId].add(followeeId)
        

    def unfollow(self, followerId, followeeId):
        """
        Follower unfollows a followee. If the operation is invalid, it should be a no-op.
        :type followerId: int
        :type followeeId: int
        :rtype: void
        """
        self.followlist[followerId].discard(followeeId)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敛滋,隨后出現(xiàn)的幾起案子许布,更是在濱河造成了極大的恐慌,老刑警劉巖绎晃,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜜唾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡庶艾,警方通過(guò)查閱死者的電腦和手機(jī)袁余,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咱揍,“玉大人颖榜,你說(shuō)我怎么就攤上這事∶喝梗” “怎么了掩完?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)硼砰。 經(jīng)常有香客問(wèn)我且蓬,道長(zhǎng),這世上最難降的妖魔是什么题翰? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任恶阴,我火速辦了婚禮,結(jié)果婚禮上豹障,老公的妹妹穿的比我還像新娘冯事。我一直安慰自己,他們只是感情好血公,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布昵仅。 她就那樣靜靜地躺著,像睡著了一般累魔。 火紅的嫁衣襯著肌膚如雪岩饼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天薛夜,我揣著相機(jī)與錄音籍茧,去河邊找鬼。 笑死梯澜,一個(gè)胖子當(dāng)著我的面吹牛寞冯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晚伙,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼吮龄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了咆疗?” 一聲冷哼從身側(cè)響起漓帚,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎午磁,沒(méi)想到半個(gè)月后尝抖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毡们,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年昧辽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衙熔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搅荞,死狀恐怖红氯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咕痛,我是刑警寧澤痢甘,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站茉贡,受9級(jí)特大地震影響塞栅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜块仆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一构蹬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悔据,春花似錦庄敛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至头滔,卻和暖如春怖亭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坤检。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工兴猩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人早歇。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓倾芝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親箭跳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晨另,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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