我目前有以下类型的列表:
[["'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"]]我正试图将这个列表转换为一个python字典,必须将其写入(json.dumps)到JSON输出文件中,如下所示:
[{"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]-but由于现有的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顺波生:早上好
00:01:46嘉义林:1
00:01:47刘百通:是的,给我发电子邮件
00:01:47天帆:下午一批
00:01:48里昂吕克:1
00:01:48王志谦:1
00:01:49嘉辉路:1
00:01:49陈世明:1
00:07:47江燕如:1
描述这是什么:这是一个缩放聊天的样本,我正在试图操纵。我正在获取这个input.txt文件,并试图输出一个JSON文件,该文件以以下格式显示人名和用户在缩放聊天中的聊天次数:(示例格式)
[{"Person":"John Smith","Message":8},
{"Person":"Yiyang Chen","Message":10},
{"Person":"Junbo Sheng","Message":2}…]我希望现在的情况更清楚。此外,我知道我的代码不是很干净,因为我是一个初学者,我希望你能帮上忙。
提前谢谢。
发布于 2021-02-11 14:20:44
原始代码的主要问题是试图将结构化数据表示为字符串。然后,您随后尝试将其转换回可用的数据。
正如您所遇到的,处理这个问题变得非常麻烦,因为您正在创建一个非标准格式,并试图在随后的步骤中解析该格式。
相反,您可以做的是在代码中以结构化的方式存储数据。
一种方法是将问题分解为两个步骤:
下面,我使用collections.defaultdict来统计每个用户发送的消息数量。
然后,我使用一个列表理解将其转换为一个字典列表。
您还可以通过使用maxsplit参数str.split来稍微清理数据提取。
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()]本质上,这个版本遵循与原始版本相同的模式,但第一部分要简单得多&您的最后一个循环被一个列表理解所取代,它创建了一个字典列表,而不是一个嵌套的字符串列表。
发布于 2021-02-11 13:54:18
实际上,您有一个列表,其中的内部列表包含一个字符串。由于该字符串的格式很简单,您可以使用regex来解析它,并使用它提供一个字典。演示:
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字符串或文件.
发布于 2021-02-11 13:52:10
下面是我的建议,使用一个函数将列表中的每一项转换为所需的字典:
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}]https://stackoverflow.com/questions/66155679
复制相似问题