python - 在字典值的条件之后重新排序或重新创建字典键 -
问题描述
我有以下字典,
test_dict = {1: 'Okay', 2: 'not good', 3: 'not well', 4: 'fine'}
由此,我想检查一个值的长度是否大于 4,如果是,则分成大小均匀的块。一旦块发生,我想添加一个键并为这些块赋值。例如,输出如下:
out_dict = {1:'Okay', 2: 'not ', 3: 'good', 4: 'not ', 5: 'well', 6: 'fine'}
如果您看到因为test_dict
的键 2 和 3 的字符串大于 4,它们会被拆分,并且每个拆分都应该获得自己的键和拆分值作为键 2、3、4、5 的值。
这是我到目前为止所尝试的,
list_of_no_change = []
list_of_changed_dicts = []
for k, v in test_dict.items():
no_change = {}
temp_dict = {}
if len(v) > 4:
# Divide into chunks
chunks = [v[i:i + 4] for i in range(0, len(v), 4)]
k_increment = 1
for ix, vl in enumerate(chunks):
if ix == 0:
temp_dict[k] = vl
else:
new_k = k + k_increment
# print('Senetence id::>>>',ix, 'Value::>>>',vl, 'new key value::>>>',new_k)
temp_dict[new_k] = vl
k_increment +=1
else:
no_change[k] = v
list_of_changed_dicts.append(temp_dict)
list_of_no_change.append(no_change)
我从两个列表中得到的输出,并不接近我要去的地方:(
list_of_no_change - [{1: 'Okay'}, {}, {}, {4: 'fine'}]
list_of_changed_dicts - [{}, {2: 'not ', 3: 'good'}, {3: 'not ', 4: 'well'}, {}]
任何帮助/建议来实现我的输出都会很棒。
解决方案
我不确定您要使用这两个列表做什么,但主要问题是您根本没有正确计算。解决这个问题的最简单方法是无条件地分块,然后enumerate()
用于构造输出。
chunks = (v[i:i+4] for v in test_dict.values() for i in range(0, len(v), 4))
out_dict = {i: s for i, s in enumerate(chunks, 1)}
# {1: 'Okay', 2: 'not ', 3: 'good', 4: 'not ', 5: 'well', 6: 'fine'}
这里我做chunks
了一个生成器表达式来避免构造一个列表。
我假设您使用的是 Python 3.7+,其中 dicts 保留插入顺序。如果没有,您可以替换test_dict.values()
为(test_dict[k] for k in sorted(test_dict))
.
推荐阅读
- javascript - 如何解决“刚刚评估了以下值。” 对于链式 then 函数
- android - 我的 api 链接的意外响应代码 500
- macros - 在运行时处理内部变量和数据结构的 LISP 宏
- javascript - 垂直滚动 html webos 应用程序
- javascript - How to Export Variables with a Dynamic Names
- android - 如何使用 gps 提供跟踪用户位置的服务?
- javascript - 难以发出多个 api / http node.js 请求
- android - Network Only Resource From Livedata To RxJava
- linux - 跟踪 syslog() 调用的来源
- php - 使用 PHP/Symfony/Twig 将插件添加到简单的应用程序