有没有更 Pythonic 的方式来处理字典?

时间:2021-01-27 16:48:28

标签: python python-3.x dictionary

我正在利用这样一个事实:对于 python >= 3.7 字典中的元素是按插入顺序检索的。

我想创建一个字典,其中第一个 skip 项目包含零;之后,他们从主字典中获取相关值

dict_1 = {
    'a1' : 11,
    'a2' : 12,
    'a3' : 13,
    'b1' : 14,
    'b2' : 15,
    'c1' : 16,
}

skip = 3

dict_2 = {}
for item in range(skip):
    dict_2[str(item)] = 0

index = 0
for key, item in dict_1.items():
    index += 1
    if index > skip:
        dict_2[key] = item

print(dict_2)
<块引用>

{'0': 0, '1': 0, '2': 0, 'b1': 14, 'b2': 15, 'c1': 16}

为免生疑问,dict_2 中的键与 dict_1 中的键不同,用于项目

这符合我的要求,但不雅。我可以采取更pythonic的方法吗?

3 个答案:

答案 0 :(得分:1)

您可以使用 islice 来避免 if 检查:

from itertools import islice

dict_2 = {str(item): 0 for item in range(skip)}

for key, item in islice(dict_1.items(), skip, None):
    dict_2[key] = item

或者,使用 enumerate 将两个选项组合到一个循环中:

for i, (key, value) in enumerate(dict_1.items()):
    if i < skip:
        dict_2[str(i)] = 0
    else:
        dict_2[key] = value

答案 1 :(得分:0)

{(xy[0] if i>=skip else str(i)):(xy[1] if i>=skip else 0)  for i,xy in enumerate(iter(dict_1.items()))}

但是让我们记住Simple is better than complex and Readability counts.

答案 2 :(得分:0)

不确定这是您的想法(没有得到您的确认),请尽量对您的原始代码进行最少的更改,并保留原件。 keys 也完好无损:

skip = 3

dict_2 = dict_1.copy()   # create a new copy for updating


for k, v in dict_1.items():
    if skip > 0:
        dict_2[k] = 0
    skip -= 1


print(dict_2)