如何将列表的列表转换为以下格式的python字典?



我目前有以下类型的列表:

[["'Person':Yiyang Chen,'Message':10"], ["'Person':Junbo Sheng,'Message':2"], ["'Person':Jiayi Lin,'Message':4"], ["'Person':Baitong Liu,'Message':8"], ["'Person':Zian Fan,'Message':9"]]

我正在尝试将列表列表转换为必须写入JSON输出文件的python字典(JSON .dumps),如下所示:

[{"Person":"John Smith","Message":8},…]

我如何做到这一点?

用于类型为-

的列表
cars_list = [[1,'Honda','red'], [2,'Toyota','white'], [3,'Mazda','blue']]

我明白使用下面的代码可以工作-

cars_dict = {}
for key, car, color in cars_list:
cars_dict[key] = [car, color]

-但由于现有的a:b, c:d格式

,我无法将前列表的列表操作成我试图获得的格式编辑:这是我编写的代码,它给了我列表的结果列表:

f = open("input.txt", "r")
# d = defaultdict(int)
keylist = []
final_use = []
for line in f:
lineslist = line.split()
nameslist = lineslist[1:3]
nameslist = [s.replace(':', '') for s in nameslist]
keylist.append(nameslist[0]+" "+nameslist[1])
# print(keylist)
d = {}
[d.__setitem__(item,1+d.get(item,0)) for item in keylist]
# print(d)
for person in d:

final_use.append(["'Person':"+str(person)+","+"'Message':"+str(d[person])])
print(final_use)

这段代码的示例输出是我在 开头附加的列表的列表样本输出:

[["'Person':Yiyang Chen,'Message':10"], ["'Person':Junbo Sheng,'Message':2"], ["'Person':Jiayi Lin,'Message':4"], ["'Person':Baitong Liu,'Message':8"], ["'Person':Zian Fan,'Message':9"]]

以下是input.txt中数据的示例:(不包括整个数据,因为它是一个巨大的文件)注意:条目之间有空行

00:01:44陈益阳:你好

00:01:46 Junbo Sheng: good morning

00:01:46林佳怡:1

00:01:47刘柏桐:是的,给我发邮件

00:01:47 Zian Fan: afternoon batch

00:01:48 Leon Luc: 1

00:01:48 Zhiqian Wang: 1

00:01:49 Jiahui Lu: 1

00:01:49陈世明:1

00:07:47 Yanru Jiang: 1

这是关于什么的描述:这是一个缩放聊天的例子,我试图操纵。我正在使用这个input.txt文件,并尝试输出一个JSON文件,该文件以以下格式显示该人的姓名和该人在缩放聊天中的聊天次数:(示例格式)

[{"Person":"John Smith","Message":8},
{"Person":"Yiyang Chen","Message":10},
{"Person":"Junbo Sheng","Message":2}…]

我希望这是更清楚了。此外,我知道我的代码不是很干净,因为我是一个初学者,我希望你能帮助。

提前感谢。

您实际上有一个列表的列表,其中内部列表包含一个字符串。由于该字符串的格式很简单,因此可以使用正则表达式对其进行解析并将其提供给字典。演示:

import re
import pprint
ll = [["'Person':Yiyang Chen,'Message':10"], ["'Person':Junbo Sheng,'Message':2"],
["'Person':Jiayi Lin,'Message':4"], ["'Person':Baitong Liu,'Message':8"],
["'Person':Zian Fan,'Message':9"]]
rx = re.compile(r"s*'Person's*:s*(.*?)s*,s*'Message's*:s*(.*)s*$")
d = [{'Person': m.group(1), 'Message': m.group(2)}
for m in [rx.match(i[0]) for i in ll]]
pprint.pprint(d)

给出预期结果:

[{'Message': '10', 'Person': 'Yiyang Chen'},
{'Message': '2', 'Person': 'Junbo Sheng'},
{'Message': '4', 'Person': 'Jiayi Lin'},
{'Message': '8', 'Person': 'Baitong Liu'},
{'Message': '9', 'Person': 'Zian Fan'}]

但是在看到了构建列表的列表的方法之后,直接构建字典列表会简单得多。你只需要稍微改变一下你的脚本结尾:

...
# print(d)
for person in d:

final_use.append({'Person': person, 'Message': d[person])})
print(final_use)

final_use可以直接用于生成JSON字符串或文件…

原始代码的主要问题是您试图将结构化数据表示为字符串。然后,您随后试图将其转换回可用的数据。

正如您所遇到的,这变得相当麻烦,因为您正在创建一个非标准格式,并试图在后续步骤中解析它。


你可以做的是,在你的代码中以结构化的方式存储数据。

一种方法是把问题分成两步:

  1. 将消息计数存储为字典,将每个人的姓名映射到消息总数。
  2. 将其转换为您想要的格式-字典列表。

下面,我使用collections.defaultdict来保存每个用户发送的消息的数量。

然后,使用列表推导式将其转换为字典列表。

您还可以使用str.splitmaxsplit参数来稍微清理数据提取。

import collections
counts = collections.defaultdict(int)
with open('input.txt') as f:
for line in f:
# first, remove the unwanted colon from the line
line = line.replace(':', '')

# next, split the line up (at most 3 splits)
# we "discard" the first & last fields, and keep only the middle two (first & last name)
_, first, last, _ = line.split(maxsplit=3)
# increment the number of messages for this user
# using an f-string to combine the two names into a string that can be used as a key
counts[f'{first} {last}'] += 1
# now, loop through the key-value pairs, and convert each into a dict (rather than a string representation)
result = [{'Person': k, 'Messages': v} for k, v in counts.items()]

基本上,这个版本遵循与原始版本相同的模式,除了第一部分要简单得多&最后的循环将被一个列表推导式取代,该列表推导式创建一个字典列表,而不是一个嵌套的字符串列表。

我的建议是,使用一个函数将列表中的每一项转换为所需的字典:

l=[["'Person':Yiyang Chen,'Message':10"], ["'Person':Junbo Sheng,'Message':2"], ["'Person':Jiayi Lin,'Message':4"], ["'Person':Baitong Liu,'Message':8"], ["'Person':Zian Fan,'Message':9"]]
def f(x):
x2=x[0]
x3=x2.split(',')
x4={i.split(':')[0][1:-1]:int(i.split(':')[1]) if i.split(':')[1].isdigit() else i.split(':')[1] for i in x3}
return x4
res=[f(i) for i in l]

打印(res)

输出:

[{'Person': 'Yiyang Chen', 'Message': 10}, {'Person': 'Junbo Sheng', 'Message': 2}, {'Person': 'Jiayi Lin', 'Message': 4}, {'Person': 'Baitong Liu', 'Message': 8}, {'Person': 'Zian Fan', 'Message': 9}]

相关内容

  • 没有找到相关文章

最新更新