如何返回包含属于多个dicts列表的项目的最长列表的字典?

时间:2016-06-20 23:49:33

标签: python list dictionary

真的很难说出这个问题,而且我也在解决如何解决这个问题。 说我有以下字典。

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}]
          }

通常情况下,我能够找出这种东西,但出于某种原因,我遇到了这个问题。有没有办法用惯用法来解决这个问题,也许是使用过滤器或者是嵌套的字典理解?

3 个答案:

答案 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