在Python中索引排序数据的正确方法

时间:2017-05-29 11:22:04

标签: python list sorting dictionary indexing

有一个排序列表,其中包含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},
]

列表的每个元素都包含带字段的字典

  1. 日期
  2. 类别
  3. 数据
  4. 列表按字典元素的日期排序。

    问题是基于

    有两种类型的功能在列表上运行
    • 按列表的排序顺序排列日期(这就是数据按列表中的日期排序的原因)
    • 数据类别

    所以,我必须遍历完整列表,多次操作单个类别。

    我提出的一个解决方案是维护一个字典,其中键作为类别,值作为排序列表中的索引。

    index = {'create': [0, 2], 'use': [1]}
    

    我想知道实现此功能的最佳或pythonic方法是什么?或者如果有这样的数据结构。

3 个答案:

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

在类别createuse的列表中创建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