【问题标题】:Fastest way to sort sublists in dictionary?对字典中的子列表进行排序的最快方法?
【发布时间】:2020-07-01 08:16:10
【问题描述】:

在python中将子列表元素排序到字典中的最快方法是什么?我将举例说明我是如何解决这个问题的,但我认为应该有更好的方法。对于小列表来说这不是问题。但是我有很多数据要以这种方式排序,所以我需要优化版本。

输入:

my_data = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]

my_dict = {}

my_dict['key 0'] = [item[0] for item in my_data]
my_dict['key 1'] = [item[1] for item in my_data]
my_dict['key 2'] = [item[2] for item in my_data]
my_dict['key 3'] = [item[3] for item in my_data]
my_dict['key 4'] = [item[4] for item in my_data]

enter cod`enter code here`e here

这就是我想要得到的输出。

输出

{'key 0': [1, 1, 1],
 'key 1': [2, 2, 2],
 'key 2': [3, 3, 3],
 'key 3': [4, 4, 4],
 'key 4': [5, 5, 5]}

【问题讨论】:

  • 如果您需要从运行时性能的角度对其进行优化,无论如何它不会更快,因为在任何实现中您都需要触及每个列表的每个元素。跨度>

标签: python list sorting dictionary data-analysis


【解决方案1】:
my_data = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
keys = ["key 0", "key 1", "key 2", "key 3", "key 4"]

print({k: [row[index] for row in my_data] for index, k in enumerate(keys)})

编辑:可能最快的方法是使用 zip 和枚举,而不是将结果转换为列表或字符串格式化键:

print(dict(enumerate(zip(*my_data))))  
# {0: (1, 1, 1), 1: (2, 2, 2), 2: (3, 3, 3), 3: (4, 4, 4), 4: (5, 5, 5)}

如果密钥是预定义的,只需再次使用 zip:

print(dict(zip(keys, zip(*my_data))))  
# {'key 0': (1, 1, 1), 'key 1': (2, 2, 2), 'key 2': (3, 3, 3), 'key 3': (4, 4, 4), 'key 4': (5, 5, 5)}

【讨论】:

  • 解决方案更紧凑但速度不快:(
  • @Kozaki 你的数据有多大?
  • 目前我有大约 200 个文件,其中包含 30K 行数据。在未来,这将变得更大
【解决方案2】:

您可以使用列表理解 init 尝试字典理解。

my_data = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
my_dict = {'key {}'.format(i): [v[i] for _ in range(len(my_data))] for i, v in enumerate(my_data)}
print(my_dict)

输出

{'key 0': [1, 1, 1], 'key 1': [2, 2, 2], 'key 2': [3, 3, 3]}

【讨论】:

    【解决方案3】:

    另一种可能的方式是使用zip

    my_data = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
    result = {f'key {i}': list(t) for i, t in enumerate(zip(*my_data))}
    

    zip(*L) 是转置列表列表的常用习语。

    【讨论】:

      【解决方案4】:

      从@Ronie Martinez 中删除 keys

      my_data = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
      my_dict = {f'key {i}': [v[i] for v in my_data] for i, _ in enumerate(max(my_data))}
      print(my_dict)
      

      【讨论】:

        【解决方案5】:

        在我的解决方案中,我假设子列表可以具有可变长度。例如,您可能有类似的东西 - [[1,2,3], [1,2]]。在这种情况下,您应该使用以下解决方案。

        from collections import defaultdict
        my_dict = defaultdict(list)
        
        for list_ in my_data:
            for index, number in enumerate(list_):
                my_dict['key ' + str(index)].append(number)
        

        【讨论】:

        • 子列表的长度固定为 8 项。唯一的变量是子列表的数量,它由我的文件中的行数给出
        猜你喜欢
        • 2021-08-14
        • 2018-11-02
        • 2012-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        相关资源
        最近更新 更多