把一本字典分成一系列较小的字典

2024-10-02 20:33:26 发布

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

我已经从一个表中提取了数据,但它不是一个用TR/TD标记生成的常规表,而是用DIV和SPAN生成的。我已经把我的数据写进了口述稿

{'ab1911': '2', 'ab1912': '1', 'ab1938': '1', 'ab1939': '0','ab1965': '18', 'ab1966': '12', 'ab1993': '18', 'ab1994': '10','ab2021': '5', 'ab2022': '21', 'ab2049': '4', 'ab2050': '4'}.

在这里,字典的键是元素的唯一ID,本质上是动态的。每次重新加载ID都会更改

web表中的实际数据如下

Revision | Iteraion
   2          1
   1          0
   18         12
   18         10
   5          21
   4          4

我要做的是选择最大修订的行,如果修订相同,那么选择最大迭代的行。正确答案是第18版和第12版

我想的是,如果我能把这本字典转换成这样一个小字典列表

[{'ab1911': '2', 'ab1912': '1'},{'ab1938': '1', 'ab1939': '0'},{'ab1965': '8', 'ab1966': '18'},{'ab1993': '18', 'ab1994': '10'},{'ab2021': '5', 'ab2022': '21'},{'ab2049': '4', 'ab2050': '4'}]

然后比较列表中每个元素的第一个键值并找到最大值。 在得到值之后,我可以用键(选择器的ID)从表中选择最大值。 那么我怎样才能把字典转换成更小的字典呢


Tags: 数据id字典ab1911ab1966ab1939ab1994ab1965
2条回答

假设您希望完全按照所描述的方式完成任务,而不考虑清洁度或可移植性,则以下代码将生成您希望看到的数组:

dict = {'ab1911': '2', 'ab1912': '1', 'ab1938': '1', 'ab1939': '0','ab1965': '18', 'ab1966': '12', 'ab1993': '18', 'ab1994': '10','ab2021': '5', 'ab2022': '21', 'ab2049': '4', 'ab2050': '4'}
arr = []
subdict = {}

itr = 0
for key,val in dict.items():
    subdict.update({key : val})
    itr = itr+1
    if(itr == 2):
        itr = 0
        arr.append(subdict)
        subdict = {}

print(arr)

来自官方文件的解决方案

如果您参考官方文档中的Itertools Recipes,那么有一个由n块进行迭代的示例。我们可以成对地迭代原始dict的键,并创建所需的listdict

Itertools配方中的原始石斑鱼方法

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x')  > ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

对成对方法的修改

def pairwise(iterable, fillvalue=None):
    args = [iter(iterable)] * 2
    return zip_longest(*args, fillvalue=fillvalue)

迭代对并创建dict列表

output = []
for key_one, key_two in pairwise(source_dict.keys()):
    output.append({key_one: source_dict[key_one], key_two: source_dict[key_two]})

旁注

正如评论所建议的,如果可能的话,您可能需要重新考虑如何读取数据

相关问题 更多 >