首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python字典对单个列表的理解

Python字典对单个列表的理解
EN

Stack Overflow用户
提问于 2022-04-11 17:37:02
回答 4查看 70关注 0票数 0

我刚开始学习Python并构建了一个产品评审应用程序,但是遇到了一个我无法从文档中解决的问题。

我有以下数据,我喜欢重新构造。

代码语言:javascript
运行
复制
data = [{'Product_name': 'Razor Blade 14', 'Area': 'CPU', 'Rating': 6.15}, 
{'Product_name': 'Razor Blade 14', 'Area': 'Grpahics', 'Rating': 5.0}, 
{'Product_name': 'Razor Blade 14', 'Area': 'Screen', 'Rating': 9}, 
{'Product_name': 'Macbook Pro', 'Area': 'CPU', 'Rating': 8}, 
{'Product_name': 'Macbook Pro', 'Area': 'Graphics', 'Rating': 5.0}]

我想为每个包含评级的产品生成一个列表

代码语言:javascript
运行
复制
[
    ["Razor Blade 15","6.15","5.0","9"],
    ["Macbook Pro","9","8","5.0"]
]

我试过:

代码语言:javascript
运行
复制
super_dict = {}
for d in data:
    for k, v in d.items():
        super_dict.setdefault(k, []).append(v)
print(super_dict)

这几乎是可行的,但并不完全是:

代码语言:javascript
运行
复制
{'Product_name': ['Razor Blade 14', 'Razor Blade 14', 'Razor Blade 14', 'Macbook Pro', 'Macbook Pro'], 'Area': ['CPU', 'Grpahics', 'Screen', 'CPU', 'Graphics'], 'Rating': [6.15, 5.0, 9, 8, 5.0]}

有什么方法可以把数据和工作转换成我需要的格式吗?

干杯

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-04-11 18:32:05

以下是我的做法:

代码语言:javascript
运行
复制
dict_object = {}
for datum in data:
    name = datum["Product_name"]
    rating = str(datum["Rating"])
    dict_object.setdefault(name, [name]).append(rating)

此时,dict_object是一个字典,它的键是产品的名称,值是我们想要的。

代码语言:javascript
运行
复制
{'Razor Blade 14': ['Razor Blade 14', '6.15', '5.0', '9'],
 'Macbook Pro': ['Macbook Pro', '8', '5.0']}

为了得到我们想要的,我们将只取以下的值:

代码语言:javascript
运行
复制
result = list(dict_object.values())

其结果是:

代码语言:javascript
运行
复制
[['Razor Blade 14', '6.15', '5.0', '9'], ['Macbook Pro', '8', '5.0']]

这里的关键是setdefault是如何工作的:将其实现看作

代码语言:javascript
运行
复制
def setdefault(dict_object, key, value):
    if key not in self:
        dict_object[key] = value
    return dict_object[key]

这意味着如果密钥不在字典中,那么它将使用value创建。最后,该方法返回值。

更新

为了将名称与评级分开:

代码语言:javascript
运行
复制
dict_object = {}
for datum in data:
    name = datum["Product_name"]
    rating = str(datum["Rating"])
    dict_object.setdefault(name, []).append(rating)
result = list(dict_object.items())

结果将是

代码语言:javascript
运行
复制
[('Razor Blade 14', ['6.15', '5.0', '9']), ('Macbook Pro', ['8', '5.0'])]
票数 1
EN

Stack Overflow用户

发布于 2022-04-11 17:54:15

我相信一些尝试和错误会使你得到你想要的答案。

我要做以下几点:

product_ratings.setdefault(product_data'Product_name',[]).append(str(product_data'Rating'))

  1. 为数据中的product_data创建product name -> list of ratings product_ratings = {}字典

  1. 迭代这个临时字典,以获得product_name的预期结果= [],product_ratings.items():result.append(product_name +评级)

中的评级

票数 1
EN

Stack Overflow用户

发布于 2022-04-11 17:47:56

迭代数据,将与产品名称相对应的评级保存在列表中的字典中,然后根据最终输出修改字典结果。

代码语言:javascript
运行
复制
data = [{'Product_name': 'Razor Blade 14', 'Area': 'CPU', 'Rating': 6.15}, 
{'Product_name': 'Razor Blade 14', 'Area': 'Grpahics', 'Rating': 5.0}, 
{'Product_name': 'Razor Blade 14', 'Area': 'Screen', 'Rating': 9}, 
{'Product_name': 'Macbook Pro', 'Area': 'CPU', 'Rating': 8}, 
{'Product_name': 'Macbook Pro', 'Area': 'Graphics', 'Rating': 5.0}]
 
dic = {}
for record in data:
    if record['Product_name'] not in dic:
        dic[record['Product_name']] =[]
    dic[record['Product_name']].append(record.get('Rating'))
result =[[k, *v] for k, v in dic.items() ]
print(result)
# [['Razor Blade 14', 6.15, 5.0, 9], ['Macbook Pro', 8, 5.0]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71832053

复制
相关文章

相似问题

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