日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

dict过滤 python_关于python:过滤dict以只包含某些键?

發(fā)布時(shí)間:2025/3/19 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dict过滤 python_关于python:过滤dict以只包含某些键? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我有一個(gè)dict,有很多條目。我只對(duì)其中一些感興趣。有沒有一種簡(jiǎn)單的方法可以把其他的修剪掉?

構(gòu)建新的dict:

dict_you_want = { your_key: old_dict[your_key] for your_key in your_keys }

使用字典理解。

如果您使用的版本缺少它們(如python 2.6和更早版本),請(qǐng)使用dict((your_key, old_dict[your_key]) for ...)。這是一樣的,雖然更丑。

請(qǐng)注意,與Jnnnn的版本不同,這對(duì)于任何大小的old_dict都具有穩(wěn)定的性能(僅取決于您的密鑰數(shù)量)。無論是速度還是記憶。因?yàn)檫@是一個(gè)生成器表達(dá)式,所以它一次只處理一個(gè)項(xiàng)目,而不查看舊字典的所有項(xiàng)目。

移除所有東西:

unwanted = set(keys) - set(your_dict)

for unwanted_key in unwanted: del your_dict[unwanted_key]

不知道你也能聽寫理解…漂亮!這是一個(gè)很好的解決方案。

"使用字典理解,如果使用缺少字典的版本"==版本<=2.6

如果其中一個(gè)文件管理器鍵不在舊的_dict中,則引發(fā)keyError。如果在d_中有k,則建議在filter中為k執(zhí)行k:d[k]

@是的,如果這是需求的一部分,你需要做些什么。無論是靜默地刪除鍵、添加默認(rèn)值還是其他什么,都取決于您正在做什么;在許多用例中,您的方法是錯(cuò)誤的。還有很多地方,old_dict中缺少的鍵指示其他地方存在錯(cuò)誤,在這種情況下,我非常喜歡錯(cuò)誤,而不是默許錯(cuò)誤的結(jié)果。

@Delnan,還有"if k in d"的加法,如果d很大,會(huì)減慢速度,我只是覺得值得一提。

@不是的,字典查找是O(1)。

@德爾南,對(duì)吧-當(dāng)然

如果您不想在密鑰不存在的情況下拋出錯(cuò)誤,則可以這樣操作:dict_you want=dict((key,old_dict[key])for key in[k for k in your_keys if k in old_dict])

很好的解釋,特別是O(1)

NIT:字典是散列圖,所以正常情況下是O(1)。最壞(極不可能)的情況是O(N),但取決于哈希沖突的可能性。你需要一本天文大字典,或者一個(gè)非常粗糙的哈希算法來開始發(fā)現(xiàn)這是一個(gè)問題。stackoverflow.com/a/1963514/1335793

我認(rèn)為這應(yīng)該是"不需要的=集(鍵)&set(您的口述)",即設(shè)置交集(&amp;),而不是設(shè)置差(-)。假設(shè)密鑰是不需要的密鑰列表。

稍微優(yōu)雅一點(diǎn)的聽寫理解:

foodict = {k: v for k, v in mydict.items() if k.startswith('foo')}

投票贊成的我在考慮增加一個(gè)類似的答案。不過出于好奇,為什么在dict.items()中,k:v表示k,v,而不是在dict中,k:dict[k]表示k…有性能差異嗎?

回答了我自己的問題。在dict…中,k的k:dict[k]速度大約快20-25%,至少在python 2.7.6中,字典中有26個(gè)項(xiàng)目(timeit(…,setup="d=chr(x+97):x+1代表x in range(26)"),這取決于篩選出的項(xiàng)目數(shù)(篩選出輔音鍵比篩選出元音鍵快,因?yàn)槟檎业捻?xiàng)目較少)。隨著字典大小的增長(zhǎng),性能上的差異可能會(huì)變得不那么顯著。

如果使用mydict.iteritems(),性能可能相同。.items()創(chuàng)建另一個(gè)列表。

下面是Python2.6中的一個(gè)示例:

>>> a = {1:1, 2:2, 3:3}

>>> dict((key,value) for key, value in a.iteritems() if key == 1)

{1: 1}

過濾部分是if語(yǔ)句。

如果您只想選擇非常多的鍵中的一些,這個(gè)方法比Delnan的答案慢。

但我想我可能會(huì)用if key in ('x','y','z')。

如果你已經(jīng)知道你想要哪把鑰匙,用德爾南的答案。如果需要用if語(yǔ)句測(cè)試每個(gè)鍵,請(qǐng)使用ransford的答案。

這個(gè)解決方案還有一個(gè)優(yōu)點(diǎn)。如果字典是從昂貴的函數(shù)調(diào)用(即a/old_dict是函數(shù)調(diào)用)返回的,則此解決方案只調(diào)用一次函數(shù)。在命令式環(huán)境中,將函數(shù)返回的字典存儲(chǔ)在變量中并不重要,但在函數(shù)式環(huán)境(例如lambda中)中,這是關(guān)鍵觀察。

您可以使用我的Funcy庫(kù)中的Project函數(shù)來完成此操作:

from funcy import project

small_dict = project(big_dict, keys)

還可以看一下select_鍵。

這一個(gè)線性lambda應(yīng)該工作:

dictfilt = lambda x, y: dict([ (i,x[i]) for i in x if i in set(y) ])

下面是一個(gè)例子:

my_dict = {"a":1,"b":2,"c":3,"d":4}

wanted_keys = ("c","d")

# run it

In [10]: dictfilt(my_dict, wanted_keys)

Out[10]: {'c': 3, 'd': 4}

它是一個(gè)基本的列表理解,迭代您的dict鍵(x中的i),并輸出一個(gè)tuple(key,value)對(duì)列表,前提是該鍵位于您想要的key list(y)中。dict()將整個(gè)內(nèi)容包裝成dict對(duì)象輸出。

應(yīng)該使用set作為wanted_keys,否則看起來不錯(cuò)。

如果我的原始字典包含列表而不是值,這將給我一個(gè)空白字典。有什么解決辦法嗎?

@弗朗西斯科,你能舉個(gè)例子嗎?如果我運(yùn)行:dictfilt({'x':['wefwef',52],'y':['iuefiuef','efefij'],'z':['??oiejf','iejf']}, ('x','z')),它會(huì)按預(yù)期返回{'x': ['wefwef', 52], 'z': ['oiejf', 'iejf']}。

我試了一下:dict={'0':[1,3], '1':[0,2,4], '2':[1,4]},結(jié)果是{},我認(rèn)為這是一個(gè)空白的口述。

有一件事,"dict"是一個(gè)保留字,所以你不應(yīng)該用它來命名dict。你想拔出的鑰匙是什么?如果我運(yùn)行:foo = {'0':[1,3], '1':[0,2,4], '2':[1,4]}; dictfilt(foo,('0','2')),我得到:{'0': [1, 3], '2': [1, 4]},這是預(yù)期的結(jié)果。

鑒于您的原始詞典orig和您對(duì)keys感興趣的條目集:

filtered = dict(zip(keys, [orig[k] for k in keys]))

這并不如Delnan的答案好,但應(yīng)該適用于感興趣的每個(gè)Python版本。但是,它對(duì)于原始字典中存在的keys的每個(gè)元素都是脆弱的。

嗯,這基本上是我聽寫理解的"元組生成器版本"的熱切版本。確實(shí)非常兼容,盡管2005年春季2.4版中引入了生成器表達(dá)式——說真的,有人還在使用它嗎?

我不反對(duì);2.3真的不應(yīng)該再存在了。但是,作為對(duì)2.3用法的過時(shí)調(diào)查:moinmo.in/polluaboutrequireingpython24短版:rhel4,sles9,隨OS X 10.4一起提供

代碼1:

dict = { key: key * 10 for key in range(0, 100) }

d1 = {}

for key, value in dict.items():

if key % 2 == 0:

d1[key] = value

代碼2:

dict = { key: key * 10 for key in range(0, 100) }

d2 = {key: value for key, value in dict.items() if key % 2 == 0}

代碼3:

dict = { key: key * 10 for key in range(0, 100) }

d3 = { key: dict[key] for key in dict.keys() if key % 2 == 0}

所有代碼性能的片段都是用timeit來度量的,使用number=1000,并且為每段代碼收集1000次。

對(duì)于python3.6,三種過濾dict鍵的性能幾乎相同。對(duì)于Python2.7,代碼3稍微快一點(diǎn)。

只是好奇,你是從Python那里編出來的?

Matplotlib是一個(gè)很好的猜測(cè):)

R中的ggplot2-tidyverse的一部分

此功能將實(shí)現(xiàn)以下功能:

def include_keys(dictionary, keys):

"""Filters a dict by only including certain keys."""

key_set = set(keys) & set(dictionary.keys())

return {key: dictionary[key] for key in key_set}

就像Delnan的版本一樣,這個(gè)版本使用字典理解,并且對(duì)于大型字典具有穩(wěn)定的性能(僅取決于您允許的鍵數(shù),而不是字典中的鍵總數(shù))。

和Myggan的版本一樣,這個(gè)版本允許您的鍵列表包含字典中可能不存在的鍵。

作為一個(gè)額外的好處,這里是相反的,您可以通過排除原始文件中的某些鍵來創(chuàng)建字典:

def exclude_keys(dictionary, keys):

"""Filters a dict by excluding certain keys."""

key_set = set(dictionary.keys()) - set(keys)

return {key: dictionary[key] for key in key_set}

請(qǐng)注意,與Delnan的版本不同,操作沒有在適當(dāng)?shù)奈恢猛瓿?#xff0c;因此性能與字典中的鍵數(shù)有關(guān)。但是,這樣做的好處是函數(shù)不會(huì)修改提供的字典。

編輯:添加了一個(gè)單獨(dú)的函數(shù),用于從dict中排除某些鍵。

你應(yīng)該允許keys以任何一種不可更改的方式,像set接受的那樣。

啊,打得好,謝謝你指正。我會(huì)更新的。

我想知道你是否有兩個(gè)更好的功能。如果你問10個(gè)人,"invert是否意味著保留了keys的論點(diǎn),或者拒絕了keys的論點(diǎn)?"他們中有多少人會(huì)同意?

嗯,說得對(duì)。讓我看看。

更新。告訴我你的想法。

如果輸入dict中有列表而不是值,這似乎不起作用。在這種情況下,你會(huì)得到一個(gè)無效的口述。有什么解決辦法嗎?

基于德爾南接受的答案。

如果你想要的鑰匙不在舊的口述里怎么辦?Delnan解決方案將拋出一個(gè)可以捕獲的keyError異常。如果這不是你需要的,也許你想:

只包括在舊的口述和你想要的一套鑰匙中都會(huì)興奮的鑰匙。

old_dict = {'name':"Foobar", 'baz':42}

wanted_keys = ['name', 'age']

new_dict = {k: old_dict[k] for k in set(wanted_keys) & set(old_dict.keys())}

>>> new_dict

{'name': 'Foobar'}

有一個(gè)未在舊字典中設(shè)置的鍵的默認(rèn)值。

default = None

new_dict = {k: old_dict[k] if k in old_dict else default for k in wanted_keys}

>>> new_dict

{'age': None, 'name': 'Foobar'}

你也可以做{k: old_dict.get(k, default) for k in ...}。

另一種選擇:

content = dict(k1='foo', k2='nope', k3='bar')

selection = ['k1', 'k3']

filtered = filter(lambda i: i[0] in selection, content.items())

但是,您會(huì)得到由filter()返回的list(python2)或迭代器(python3),而不是dict。

把filtered包在dict里,你就能找到字典了!

簡(jiǎn)短形式:

[s.pop(k) for k in list(s.keys()) if k not in keep]

正如大多數(shù)答案所建議的那樣,為了保持簡(jiǎn)潔,我們必須創(chuàng)建一個(gè)重復(fù)的對(duì)象,無論是list還是dict。這將創(chuàng)建一個(gè)丟棄的list,但會(huì)刪除原始dict中的密鑰。

總結(jié)

以上是生活随笔為你收集整理的dict过滤 python_关于python:过滤dict以只包含某些键?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: bangbros性欧美18| 久久一道本 | 人物动物互动39集免费观看 | 丁香花电影免费播放在线观看 | 综合久久综合久久 | 国产欧美一区二区三区沐欲 | 看一级片 | 天天爽夜夜爽一区二区三区 | 韩国毛片视频 | 99综合视频| 麻豆影音先锋 | 精品国产99一区二区乱码综合 | 精品少妇一区二区三区在线观看 | 色偷偷噜噜噜亚洲男人的天堂 | 黄色国产小视频 | 国内精品嫩模av私拍在线观看 | 欧美色xxxx| 91精品人妻一区二区三区四区 | 日韩毛片在线观看 | 东北女人av| 亚洲成人免费网站 | 激情欧美日韩 | 天堂在线视频tv | 成人在线网 | 欧美日韩高清在线播放 | 色综合色| 开心激情网五月天 | 亚洲欧美另类在线观看 | 手机在线观看av网站 | 国产精品高潮呻吟久久久久久 | 日一区二区 | 奴性女会所调教 | 亚洲一级黄色 | 亚洲精品a| 国产第五页 | 放荡闺蜜高h苏桃情事h | 手机看片日韩日韩 | 制服丝袜国产在线 | 天堂色在线 | 伊人自拍 | 亚洲在线一区二区三区 | 爽爽窝窝午夜精品一区二区 | 久久久成人精品一区二区三区 | 91中文字日产乱幕4区 | 日本少妇全体裸体洗澡 | 在线观看不卡av | 阿v视频免费在线观看 | 蜜桃成熟时李丽珍在线观看 | 成人午夜淫片免费观看 | 日韩精品午夜 | 在线观看理论片 | 日韩看片 | 中文文字幕文字幕高清 | 在线看成人av | 婷婷干| 欧美一区二区视频在线观看 | 色婷婷九月| 日本欧美视频 | av黄色在线观看 | juliaann第一次和老师 | 免费看的黄色小视频 | 成人吃奶视频 | 日韩在线第三页 | 免费看美女隐私网站 | 精品午夜视频 | 国产网站在线看 | 一级性视频| 91香蕉视频在线看 | 国产一区二区三区黄片 | 欧美日韩国产综合网 | 亚洲最新av | 在线看片你懂的 | 国产综合亚洲精品一区二 | 91精品国产乱码久久久 | 国产乱码在线观看 | 爱爱视频免费看 | 欧美日韩一区二区三区四区五区六区 | 日韩国产精品视频 | 一区二区三区免费毛片 | 秋霞午夜影院 | 免费在线播放黄色片 | 中国美女洗澡免费看网站 | 欧美撒尿777hd撒尿 | 俄罗斯嫩小性bbwbbw | 日av中文字幕 | 国产影音先锋 | 国产精品美女久久久 | 天天草夜夜| 婷婷麻豆 | 欧美日韩黄色大片 | 免费av在线播放网址 | 三级全黄视频 | 四虎影视成人永久免费观看亚洲欧美 | 成人污在线观看 | 亚洲欧洲色图 | 日本欧美精品 | xxxx96| 777777av| www.久久久久久久久久 |