如何根据dict中的部分键对dict列表进行分组

2024-06-02 05:38:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我在分组我的列表时遇到了问题

假设我有这个:

data = [
{'records-0': '1'}, {'records-0-item1': '2'}, {'records-0-item2': '3'},{'records-0-item3': '4'},
{'records-1': '1'}, {'records-1-item1': '2'}, {'records-1-item2': '3'},
]

我尝试的是根据键中的索引对列表进行排序(如果有意义的话)

所以我预期的结果是这样的

sortedData = [
{0: [{'records-0': '1'}, {'records-0-item1': '2'}, {'records-0-item2': '3'},{'records-0-item3': '4'},]},
{1: [{'records-1': '1'}, {'records-1-item1': '2'}, {'records-1-item2': '3'},]
]

我试着查找分组列表,但这都是基于一个特定的键。这样地 https://www.geeksforgeeks.org/group-list-of-dictionary-data-by-particular-key-in-python/

有什么想法吗

编辑:列表中的数据基于用户输入,因此可能还有:

{'records-2': '1'}, {'records-3': '1'}, {'records-4': '1'}, etc

Tags: httpsorg列表data排序wwwgrouplist
2条回答

我建议您重新格式化sortedData并删除列表。您只能将数据收集到dict中

编辑的示例:(应按原样工作)

def sort_data(l_: list):
    d_ = dict()
    for d in l_:
        for k, v in d.items():
            i = re.split('-', k)[1]
            if not d_.get(int(i)):
                d_[int(i)] = dict()
                d_[int(i)][k] = v
                continue
            d_[int(i)][k] = v
    return d_
>>> data = [
    {'records-0': '1'}, {'records-0-item1': '2'}, {'records-0-item2': '3'}, {'records-0-item3': '4'},
    {'records-1': '1'}, {'records-1-item1': '2'}, {'records-1-item2': '3'},
]
>>> print(sort_data(data))
{
    0: {
        'records-0': '1', 
        'records-0-item1': '2', 
        'records-0-item2': '3', 
        'records-0-item3': '4'
    }, 
    1: {
        'records-1': '1', 
        'records-1-item1': '2', 
        'records-1-item2': '3'
    }
}


一种方法是使用default_dict

首先,只需定义一个helper方法即可从字符串中获取键:

def get_key_from(string):
    return int(string.split('-')[1])

然后

from collections import defaultdict

sortedData_res = defaultdict(list)
for h in data:
    k = next(iter(h))
    sortedData_res[get_key_from(k)].append({k: ''})

所以你最终得到了这个结果:

sortedData_res

#defaultdict(list,
#            {0: [{'records-0': ''},
#              {'records-0-item1': ''},
#              {'records-0-item2': ''},
#              {'records-0-item3': ''}],
#             1: [{'records-1': ''},
#              {'records-1-item1': ''},
#              {'records-1-item2': ''}]})

或者调整代码以获得不同的结果

例如,如果您.append(h),您会得到:

#defaultdict(list,
#            {0: [{'records-0': '1'},
#              {'records-0-item1': '2'},
#              {'records-0-item2': '3'},
#              {'records-0-item3': '4'}],
#             1: [{'records-1': '1'},
#              {'records-1-item1': '2'},
#              {'records-1-item2': '3'}]})

相关问题 更多 >