首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将列表列表转换为下列格式的python字典?

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

Stack Overflow用户
提问于 2021-02-11 13:27:54
回答 3查看 95关注 0票数 1

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

代码语言:javascript
复制
[["'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输出文件中,如下所示:

代码语言:javascript
复制
[{"Person":"John Smith","Message":8},…]

我怎样才能做到这一点?

关于类型列表-

代码语言:javascript
复制
cars_list = [[1,'Honda','red'], [2,'Toyota','white'], [3,'Mazda','blue']]

我知道使用下面的代码是有效的-

代码语言:javascript
复制
cars_dict = {}

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

-but由于现有的a:b,c:d格式,我无法将以前的列表操作成我要获得的格式

编辑:这是我编写的代码,给出了列表的结果列表:

代码语言:javascript
复制
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)

此代码的示例输出是我在开始时附加的列表列表。

样本输出:

代码语言:javascript
复制
[["'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文件,该文件以以下格式显示人名和用户在缩放聊天中的聊天次数:(示例格式)

代码语言:javascript
复制
[{"Person":"John Smith","Message":8},
 {"Person":"Yiyang Chen","Message":10},
 {"Person":"Junbo Sheng","Message":2}…]

我希望现在的情况更清楚。此外,我知道我的代码不是很干净,因为我是一个初学者,我希望你能帮上忙。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-11 14:20:44

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

正如您所遇到的,处理这个问题变得非常麻烦,因为您正在创建一个非标准格式,并试图在随后的步骤中解析该格式。

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

一种方法是将问题分解为两个步骤:

  1. 将邮件计数存储为字典,将每个人的姓名映射到邮件总数。
  2. 把它转换成你想要的格式--一张字典列表。

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

然后,我使用一个列表理解将其转换为一个字典列表。

您还可以通过使用maxsplit参数str.split来稍微清理数据提取。

代码语言:javascript
复制
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()]

本质上,这个版本遵循与原始版本相同的模式,但第一部分要简单得多&您的最后一个循环被一个列表理解所取代,它创建了一个字典列表,而不是一个嵌套的字符串列表。

票数 0
EN

Stack Overflow用户

发布于 2021-02-11 13:54:18

实际上,您有一个列表,其中的内部列表包含一个字符串。由于该字符串的格式很简单,您可以使用regex来解析它,并使用它提供一个字典。演示:

代码语言:javascript
复制
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)

如预期所示:

代码语言:javascript
复制
[{'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'}]

但是,在看到构建列表列表的方式之后,直接构建字典列表就会简单得多。您只需稍微修改脚本的结尾:

代码语言:javascript
复制
...
# print(d)

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

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

票数 1
EN

Stack Overflow用户

发布于 2021-02-11 13:52:10

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

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
[{'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}]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66155679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档