为特定属性解析字典列表的python方法?

2024-10-06 12:25:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我想交叉引用字典和django queryset来确定哪些元素分别具有唯一的dictionary['name']和{}值。我现在的做法是:

  • 创建字典['name']值的列表
  • 创建列表djangmodel.name价值观
  • 通过检查是否包含在这些列表中来生成唯一值列表

如下所示:

alldbTests = dbp.test_set.exclude(end_date__isnull=False)   #django queryset

vctestNames = [vctest['name'] for vctest in vcdict['tests']]   #from dictionary
dbtestNames = [dbtest.name for dbtest in alldbTests]    #from django model

# Compare tests in protocol in fortytwo's db with protocol from vc

obsoleteTests = [dbtest for dbtest in alldbTests if dbtest.name not in vctestNames]
newTests = [vctest for vctest in vcdict if vctest['name'] not in dbtestNames]

必须生成中间的名称列表(上面的第2行和第3行),只是为了能够立即检查是否包含在其中,这让人感觉不太和谐。我有遗漏什么吗?我想我可以这样把两个列表理解放在一行中:

^{pr2}$

但这似乎很难理解。在

编辑: 把初始状态想象成这样:

# vcdict is a list of django models where the following are all true
alldBTests[0].name == 'test1'
alldBTests[1].name == 'test2'
alldBTests[2].name == 'test4'

dict1 = {'name':'test1', 'status':'pass'}
dict2 = {'name':'test2', 'status':'pass'}
dict3 = {'name':'test5', 'status':'fail'}

vcdict = [dict1, dict2, dict3]

我不能转换成集合并取其不同之处,除非我将其分解为名称字符串,但是这样我就失去了对模型/字典其余部分的访问权,对吗?只有在这两种情况下都有相同类型的对象时,集合才会起作用。在


Tags: djangonameinfrom列表fordictionary字典
3条回答
vctestNames = dict((vctest['name'], vctest) for vctest in vcdict['tests'])
dbtestNames = dict((dbtest.name, dbtest) for dbtest in alldbTests)

obsoleteTests = [vctestNames[key]
                 for key in set(vctestNames.keys()) - set(dbtestNames.keys())]

newTests = [dbtestNames[key]
            for key in set(dbtestNames.keys()) - set(vctestNames.keys())]

setsintersection-和{}-操作应该可以帮助您更优雅地解决问题。在

但由于您最初处理的是dicts,这些示例和讨论可能会提供一些启示:http://code.activestate.com/recipes/59875-finding-the-intersection-of-two-dicts

你在这里使用基本的集合运算。你可以把你的对象转换成集合,然后找到交集(想想维恩图):

obsoleteTests = list(set([a.name for a in alldbTests]) - set(vctestNames))

在比较两个对象列表(pseudopython)时,集合非常有用:

^{2}$

相关问题 更多 >