0

我有一个列表字典,列表包含这样的字典:

my_dict = {
'list1': [{'catch': 100, 'id': '1'}, {'catch': 101, 'id': '2'}, 
          {'catch': 50, 'id': '1'}], 
'list2': [{'catch': 189, 'id': '1'}, {'catch': 120, 'id': '12'}], 
'list3': [{'catch': 140, 'id': '1'}, {'catch': 10, 'id': '100'}]
}

删除具有 commin 'id' 值的列表项并将它们存储在单独的列表中的最Pythonic方法是什么?所以输出会是这样的:

my_dict = {
'list1': [{'catch': 101, 'id': '2'}], 
'list2': [{'catch': 120, 'id': '12'}], 
'list3': [ {'catch': 10, 'id': '100'}],
'list4': [{'catch': 100, 'id': '1'}, , {'catch': 50, 'id': '1'}, 
          {'catch': 189, 'id': '1'}, {'catch': 140, 'id': '1'}]
}

在我的程序中,我有 7 个与此类似的列表,如果“id”出现在这些列表中的两个或多个列表中,我想将具有该“id”的项目的所有外观存储在第 8 个列表中以供进一步处理

关于,finnurtorfa

4

3 回答 3

3

考虑将您的数据重组为如下所示:

>>> import itertools
>>> { k: [d['catch'] for d in v] for k, v in itertools.groupby(sorted(itertools.chain(*my_dict.itervalues()), key=lambda d: d['id']), lambda d: d['id']) }
{'1': [100, 50, 140, 189], '2': [101], '100': [10], '12': [120]}

您尚未描述您的数据代表什么,因此这可能不适合您。但是使用的工具(chaingroupbyfrom itertools)至少应该给你一些想法。

编辑:我在测试中偶然使用了问题的示例答案。通过将排序添加到groupby.

于 2012-12-26T16:07:05.727 回答
2
>>> get_id = operator.itemgetter("id")
>>> flattened_dict = itertools.chain.from_iterable(my_dict.values())
>>> groups = itertools.groupby(sorted(flattened_dict, key=get_id), get_id)
>>> {k: list(v) for k, v in groups}
{'1': [{'catch': 100, 'id': '1'},
  {'catch': 50, 'id': '1'},
  {'catch': 140, 'id': '1'},
  {'catch': 189, 'id': '1'}],
 '100': [{'catch': 10, 'id': '100'}],
 '12': [{'catch': 120, 'id': '12'}],
 '2': [{'catch': 101, 'id': '2'}]}

解释:

  • get_idx是一个接受对象并返回的函数x["id"]
  • flattened_dict只是对所有列表的可迭代(即连接.values()所有my_dict
  • 现在我们flattened_dict使用 key 函数get_id进行排序——即按 ID 排序——并按 id 对结果进行分组。

这基本上有效,因为itertools.groupby太棒了。

于 2012-12-26T16:02:04.317 回答
0

大致如下:

my_dict = {
'list1': [{'catch': 100, 'id': '1'}, {'catch': 101, 'id': '2'}, 
      {'catch': 50, 'id': '1'}], 
'list2': [{'catch': 189, 'id': '1'}, {'catch': 120, 'id': '12'}], 
'list3': [{'catch': 140, 'id': '1'}, {'catch': 10, 'id': '100'}]
}

from itertools import groupby

sub = {}
for k in my_dict:
 for kk, g in groupby( my_dict[k], lambda v: v["id"] ):
   if not kk in sub:
    sub[kk] = []
   sub[kk] = sub[kk] + list( g )

print sub

{'1': [{'catch': 100, 'id': '1'}, {'catch': 50, 'id': '1'}, {'catch': 140, 'id': '1'}, {'catch': 189, 'id': '1'}], '12': [{'catch': 120, 'id': '12'}], '100': [{'catch': 10, 'id': '100'}], '2': [{'catch': 101, 'id': '2'}]}
于 2012-12-26T16:02:59.873 回答