簡體   English   中英

在dicts列表中,根據一個鍵/值匹配dict?

[英]In list of dicts, match dict based on one key/value?

在Python中,我有一個字典列表:

mylist = [ { 'name': 'James', 'school': 'UCLA', 'date_joined': 2001 },
           { 'name': 'Jack', 'school': 'UCLA', 'date_joined': 2001 },
           { 'name': 'Fisher', 'school': 'NYU', 'date_joined': 2003 }]

如何檢查有一定的字典是否匹配現有記錄, 根據姓名和學校的鍵/值?

所以:

example1 = { 'name': 'James', 'school': 'UCLA', 'date_joined': 2007 }
example1 = { 'name': 'James', 'school': 'UCLA', 'date_joined': 2001 }

應該匹配,但是

example3 = { 'name': 'James', 'school': 'MIT', date_joined': 2001 }

不應該。

顯然有:

for m in myList:
    if (m['name']==example['name'] and m['school']==example['school']):
        match_found = True
        continue

但是有更緊湊的方式嗎?

fields = ('name', 'school')
match_found = any(all(x[f]==example[f] for f in fields) for x in myList)

我不知道有關程序結構的更多信息,我的方法可能會有所不同:

from collections import namedtuple
import datetime

StudentRecord = namedtuple('StudentRecord', 'name school date_joined')
myset = set([StudentRecord('James', 'UCLA', 2001),
             StudentRecord('Jack', 'UCLA', 2001),
             StudentRecord('Fisher', 'NYU', 2003)])
this_year = datetime.datetime.today().year
match_found = any(StudentRecord('James', 'UCLA', year) in myset for year in range(1950, this_year))

這對於非常小的列表來說會比較慢,因為它必須每年檢查一次,但是對於成千上萬的學生名單,其中沒有一個人在1950年之前進入學校,這將會快得多。 它的年數為O(n),而列表方法的學生人數為O(n),年數可能比學生人數增長得慢得多。 (它確實要求沒有相同的記錄 - 但是,無論如何,你可能都想要它。或者,你總是可以使用列表而不是集來處理沖突。)

此外,對於一個真正的恆定時間算法,您可以使用多個相同學生列表的年份列表來執行此操作,這也解決了沖突問題:

StudentRecord = namedtuple('StudentRecord', 'name school')
mydict = {StudentRecord('James', 'UCLA'):[2001],
          StudentRecord('Jack', 'UCLA') :[2001],
          StudentRecord('Fisher', 'NYU'):[2003, 2007]}
match_found = StudentRecord('James', 'UCLA') in mydict
if all(m[k]==example[k] for k in ('school','name'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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