自定义字典键和值

2024-04-19 10:07:20 发布

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

我有一个关于改变字典格式的问题。你知道吗

字典是:

{'index': 'cfs_nucleus_bespoke_88260', 'host': 'iaasn00018224.svr.us.jpmchase.net', 'source': '/logs/tomcat7inst0/localhost_tomcat7inst0_access_log2018-11-02.txt', '_time': '2018-11-02 19:46:50.000 EDT', 'count': '1'}

我想问一下,有没有一种方法可以让我更改如下格式:

{"column1":{'index': 'cfs_nucleus_', 'host': 'iaasn00018224.net'}, "column2":{'source': '/logs/tomcat7inst0/localhost_tomcat7inst0_access_log2018-11-02.txt'}, "column3":{'_time': '2018-11-02, 'count': '1'}}

Tags: txtlocalhosthostsourceindexnet字典access
1条回答
网友
1楼 · 发布于 2024-04-19 10:07:20

您可以执行以下操作:

dict1 = {'index': 'cfs_nucleus_bespoke_88260', 'host': 'iaasn00018224.svr.us.jpmchase.net', 'source': '/logs/tomcat7inst0/localhost_tomcat7inst0_access_log2018-11-02.txt', '_time': '2018-11-02 19:46:50.000 EDT', 'count': '1'}
d1_items = list(dict1.items())
col_width = 2
dict2 = {f'column{col_num // col_width + 1}': {k: v for k, v in d1_items[col_num:col_num + col_width]} for col_num in range(0, len(dict1), col_width)}

Try it online!

有几个移动部件相互作用以创建此解决方案:

Dict comprehensions

Python有一个巧妙的技巧,它允许在iterable和dict声明中嵌入for in循环,从而有效地循环和修改一组元素。在这里,外部迭代器是range(0, len(dict1), col_width):它经历一个从0开始的整数序列,并逐渐增加col_width,直到它大于或等于列表的大小,该函数用于选择每个col_width大小的dict段的起始索引。你知道吗

元组解包

dict1.items()很方便,因为它返回每个字典键及其值的2元组的dict view。稍后,我们利用元组解包k: v for k, v in d1_items[ ... ],其中一个变量元组被展平为两个变量,然后可以很容易地形成当前字典的键值对。(这仅适用于较新版本的Python。)

List slicing

d1_items[col_num:col_num + col_width]基本上是获取子列表的一种方法。语法相对简单:从位置col_num开始,得到一个子列表,直到并排除元素col_num + col_width(即大小为col_width的子列表)。你知道吗

Formatted string literals

在字符串前面加f使其成为格式化的字符串文本。在{}中的任何内容都被解释为文本Python语法(除了'{}之外,它们的行为可能因上下文而异。)这里,在f'column{col_num // col_width + 1}'中,它允许我们用除法和+1偏移量来标记每一列,从1开始计数,而不是从0开始。(这是python3.6的新特性)

相关问题 更多 >