Python 根据键名和值组合动态排序数据

Python 根据键名和值组合动态排序数据,python,algorithm,sorting,key,key-value,Python,Algorithm,Sorting,Key,Key Value,所以,我首先要说的是,我在编程方面很糟糕。然而,我已经接触到了足够多的优秀程序员,我觉得对于我正在尝试做的事情,一定有一个更优雅的解决方案——我希望这里的人可能知道一个 我正试图找到一种对数据进行排序的好方法(我几乎无法控制)。数据以dict数组的形式传递——所有dict的定义都相同——我将根据以下标准进行排序: 任何键名都可能具有特定属性,例如以特殊字符开头(在本例中为“o”) 单个dict中的一个或多个密钥可能具有此属性 如果属性存在,则将这些DICT分组,其中拥有该属性的键的所有值都相同

所以,我首先要说的是,我在编程方面很糟糕。然而,我已经接触到了足够多的优秀程序员,我觉得对于我正在尝试做的事情,一定有一个更优雅的解决方案——我希望这里的人可能知道一个

我正试图找到一种对数据进行排序的好方法(我几乎无法控制)。数据以dict数组的形式传递——所有dict的定义都相同——我将根据以下标准进行排序:

  • 任何键名都可能具有特定属性,例如以特殊字符开头(在本例中为“o”)

  • 单个dict中的一个或多个密钥可能具有此属性

  • 如果属性存在,则将这些DICT分组,其中拥有该属性的键的所有值都相同

  • 数据呈现和返回的顺序并不重要

例如,给定以下dict格式的输入数据:

+--------+---------+-------+--------------+
| o_last | first   | o_zip |    likes     |
+--------+---------+-------+--------------+
| Smith  | Bob     | 12345 | Apples       |
| Smith  | Alice   | 12345 | Peaches      |
| Smith  | Marvin  | 54321 | Strawberries |
| Jones  | Steve   | 98765 | Potatoes     |
| Jones  | Harold  | 98765 | Beets        |
| White  | Carol   | 00001 | Fish         |
+--------+---------+-------+--------------+
将输出以下组:

+--------+---------+-------+--------------+
| Smith  | Bob     | 12345 | Apples       |
| Smith  | Alice   | 12345 | Peaches      |
+--------+---------+-------+--------------+

+--------+---------+-------+--------------+
| Smith  | Marvin  | 54321 | Strawberries |
+--------+---------+-------+--------------+

+--------+---------+-------+--------------+
| Jones  | Steve   | 98765 | Potatoes     |
| Jones  | Harold  | 98765 | Beets        |
+--------+---------+-------+--------------+

+--------+---------+-------+--------------+
| White  | Carol   | 00001 | Fish         |
+--------+---------+-------+--------------+
下面是我实现这一目标的当前功能,到目前为止,它似乎运行良好。然而,正如我上面提到的,我必须相信有一个更优雅的库或设计模式可以使用,我不知道

def sort_data(input_d):

    fields = []
    has_prop = False
    prop_fields = []
    prop_dict = {}
    out_list = []

    # create a list of keys that have the property
    [fields.append(x) for x in input_d[0].keys()]
    for field in fields:
        if re.match("^o[a-np-zA-NP-Z]*_", field):
            has_prop = True
            prop_fields.append(field)

    # if keys are found:
    if has_prop:
        for d in input_d:
            prop_vals = ""
            for f in prop_fields:
                prop_vals += d[f]

            # create an md5 hash of unique values for keys with property
            # and use it to group dicts with the same value combinations
            prop_vals_hash = hashlib.md5(prop_vals).hexdigest()
            if prop_vals_hash in prop_dict:
                prop_dict[prop_vals_hash].append(d)
            else:
                prop_dict[prop_vals_hash] = [d]

        # return data as an array of arrays, with each index
        # in that array a grouping of dicts with unique value combinations
        for k in prop_dict.keys():
            out_list.append(prop_dict[k])

    # default for input data that does not have keys possessing 
    # our property of interest
    else:
        for d in input_d:
            output_list.append([d])

    return output_list

我希望听到任何人愿意提供的任何和所有回复、建议、批评或反馈。谢谢你的阅读

我想了解是否可以假设所有属性字段都相同的记录已经彼此相邻排序——我将假设,因为否则需要排序,我无法猜测您要使用的排序标准。所以…:

output_list = []
prop_fields = [k for k in input_d[0] if k.startswith('o')]

# if keys are found:
if prop_fields:
    for k, g in itertools.group_by(input_d, key=operator.itemgetter(*prop_fields)):
        output_list.append(list(g))
else:
    output_list = [[d] for d in input_d]
return output_list
如果“订单正常且必须维护”条件不适用,则必须在
If prop\u字段后面添加:

input_d.sort(key=operator.itemgetter(*prop_fields))

但是,这与示例的保序特性不匹配(我相信,您演示的代码也不匹配)。

从您所说的,听起来您的dict代表一个表格结构(每个dict都是表中的一行)。如果是这样的话,你应该看看这个库,它提供了很多有用的工具来处理表格数据。这正是我希望从这个问题中学到的,非常感谢你花时间。你的假设是正确的,我不关心订单,因为它一点也不重要。我对原始问题进行了编辑,以确保其更加清晰。