首页 > 解决方案 > 将字典划分为较小字典的列表

问题描述

我从一个表中提取了数据,但它不是用 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

我必须选择具有最大修订的行,如果修订相同,则选择具有最大迭代的行。这里正确的答案是Revision 18Iteration 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)我可以从表中选择最大值。那么如何将字典转换为较小的字典列表

标签: pythonlistdictionary

解决方案


来自官方文档的解决方案

如果你参考官方文档上的Itertools 食谱,有一个n. 我们可以成对地迭代您的原始密钥dict并创建您需要list的密钥。dict

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)

迭代对并创建字典列表

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]})

边注

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


推荐阅读