有一个排序列表,其中包含Python长度为1000的字典元素,如下所示
[
{'date': '2017-05-20', 'category': 'create', 'data': 23},
{'date':'2017-05-21', 'category': 'use', 'data': 1},
{'date': '2017-05-23', 'category': 'create', 'data': 4},
]
列表的每个元素都包含带字段的字典
列表按字典元素的日期排序。
问题是基于
有两种类型的功能在列表上运行所以,我必须遍历完整列表,多次操作单个类别。
我提出的一个解决方案是维护一个字典,其中键作为类别,值作为排序列表中的索引。
index = {'create': [0, 2], 'use': [1]}
我想知道实现此功能的最佳或pythonic方法是什么?或者如果有这样的数据结构。
答案 0 :(得分:0)
你的想法很好。您甚至可以定义一个生成器函数,该函数将类别作为输入,如下所示
def list_by_category(category, original_list):
for entry in original_list:
if entry['category'] == category:
yield entry
用法:
# Do something with 'create':
for entry in list_by_category('create'):
print entry
# Do things here..
这样可以避免为每个类别维护另一个列表的内存开销。
答案 1 :(得分:0)
在类别create
和use
的列表中创建2个带有记录索引的键的附加词典是有意义的。
例如:
create_dict = {0: {'date': '2017-05-20', 'category': 'create', 'data': 23},
2: {'date': '2017-05-23', 'category': 'create', 'data': 4}}
use_dict = {1: {'date':'2017-05-21', 'category': 'use', 'data': 1}}
但是,假设原始列表中的索引不会更改。
如果原始列表中的日期字段也是唯一的,您可以创建一个类似的字典,其中键将是日期。使用词典,您可以快速(O(1))通过键访问所有元素。如果你处理非常大的词典,那么缺点就是内存使用。
答案 2 :(得分:0)
from collections import defaultdict
original_list = [
{'date': '2017-05-20', 'category': 'create', 'data': 23},
{'date':'2017-05-21', 'category': 'use', 'data': 1},
{'date': '2017-05-23', 'category': 'create', 'data': 4},
]
# indexing
category_index = defaultdict(list)
for idx, entry in enumerate(original_list):
category_index[entry['category']].append(idx)
# using the index:
# Working with 'create'
for idx in category_index['create']:
print original_list[idx]
# Do things with entry
# Working with 'use'
for idx in category_index['use']:
print original_list[idx]
# Do things with entry