所以我们可以说我有一个大数据,看起来像这样
bigData = [
{
"name": "item 1"
},
{
"name": "item 1"
},
{
"name": "item 2"
},
{
"name": "item 2"
},
{
"name": "item 3"
},
{
"name": "item 3"
},
{
"name": "item 3"
}
]
我正在尝试编写一个函数,将数据最小化为这样的内容
cleanedBigData = [
{
"name": "item 1",
"quantity": 2
},
{
"name": "item 2",
"quantity": 2
},
{
"name": "item 3",
"quantity": 3
}
]
例如,如果尝试过类似的东西
cleanedBigData = []
for i in bigData:
for u in cleanedBigData:
if i["name"] == u["name"]:
i["quantity"] += 1
else:
cleaned_data = {
"name": i.name,
"quantity": 1
}
cleanedBigData.append(cleaned_data)
但它不起作用,可能是因为数组首先是空的,所以第二个 for
循环没有被执行
你会如何解决这个问题?
非常感谢!
最佳答案
对于Pythonic解决方案,您可以使用collections.Counter
,像这样:
from collections import Counter
c = Counter(d['name'] for d in bigData)
cleanedBigData = [{"name": name, "quantity": quantity} for name, quantity in c.items()]
为了获得学习机会,这里有一个基于您的原始代码的解决方案:
cleanedBigData = []
for i in bigData:
foundInClean = False # We need to "remember" if we found our element
for u in cleanedBigData:
if i["name"] == u["name"]:
foundInClean = True # found it!
u["quantity"] += 1
if not foundInClean: # didn't find it, create new one and append it
cleaned_data = {
"name": i["name"],
"quantity": 1
}
cleanedBigData.append(cleaned_data)
关于python - 如何编写一个函数通过在 python 中清理来缩短我的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70061870/