真的很难说出这个问题,而且我也在解决如何解决这个问题。 说我有以下字典。
mydict = { u'10441':
[{u'quantity': 1, u'productId': 10441},
{u'quantity': 25, u'productId': 10451},
{u'quantity': 100, u'productId': 10461}],
u'10451':
[{u'quantity': 1, u'productId': 10451},
{u'quantity': 4, u'productId': 10461}]
}
如何返回与其他词典具有 productId 值的最大顶级子词典词典?例如, productId 10461存在于mydict中的两个词典(10441和10451)中。我想以编程方式获得以下内容,因为此dict(10441)的值包含三个项目(dicts)。
mydict1 = { u'10441':
[{u'quantity': 1, u'productId': 10441},
{u'quantity': 25, u'productId': 10451},
{u'quantity': 100, u'productId': 10461}]
}
通常情况下,我能够找出这种东西,但出于某种原因,我遇到了这个问题。有没有办法用惯用法来解决这个问题,也许是使用过滤器或者是嵌套的字典理解?
答案 0 :(得分:2)
在你的例子中只有两个顶级词典,很难看出你真正追求的是什么。我们在谈论多少顶级词典?他们中有多少人必须共享一个ID?让我们看看你如何通过成对比较有效地做到这一点,希望你知道从那里去哪里。
首先,在每个顶级字典中创建一个ID的索引(一组)。
myindex = dict()
for k, vals in mydict.items():
myindex[k] = set(d["productId"] for d in vals)
现在我们将比较索引。要查看两个词典是否具有共同的ID,请选择它们的交集:
mydict1 = dict()
for key1, key2 in itertools.combinations(mydict, 2):
if myindex[key1].intersection(myindex[key2]):
bigkey = key1 if len(mydict[key1]) > len(mydict[key2]) else key2
mydict1[bigkey] = mydict[bigkey]
答案 1 :(得分:1)
你可以这样做。 try/except
就在那里,以防id列表的 none 包含给定的产品ID(由于空序列,会导致max
引发ValueError
)。
当您的产品词典中的多个项目包含相同数量的项目时(即,有一个以上“最长”的词典),答案有些模棱两可。
pid = 10461
try:
mid, mlist = max(((id, dlist) for id, dlist in mydict.iteritems() if any(d['productId'] == pid for d in dlist)), key=lambda x: len(x[1]))
mdict1 = {mid: mlist}
except ValueError:
mdict1 = None
答案 2 :(得分:0)
使用id2parents
跟踪每个产品ID的父ID。对于父项数与mydict
中元素数相同的任何产品ID,它必须存在于每个目录中。将此类目录ID收集到parent_ids
中,并按其大小排序,然后选择第一个:
mydict = { u'10441':
[{u'quantity': 1, u'productId': 10441},
{u'quantity': 25, u'productId': 10451},
{u'quantity': 100, u'productId': 10461}],
u'10451':
[{u'quantity': 1, u'productId': 10451},
{u'quantity': 4, u'productId': 10461}]
}
id2parents = {}
for parent_id, subdirs in mydict.iteritems():
for d in subdirs:
id2parents.setdefault(d['productId'], []).append(parent_id)
parent_ids = []
for product_id, dirs in id_dirs.iteritems():
if len(dirs) == len(mydict.values()):
parent_ids += dirs
parent_ids.sort(key=lambda parent_id: len(mydict[parent_id]), reverse=True)
mydict1 = mydict[parent_ids[0]]
print mydict1