面试题答案
一键面试from collections import defaultdict
def aggregate_data(lst):
result = defaultdict(lambda: {'count': 0, 'total': 0, 'strings': []})
for d in lst:
category = d['category']
value = d['value']
if isinstance(value, (int, float)):
result[category]['count'] += 1
result[category]['total'] += value
elif isinstance(value, str):
result[category]['strings'].append(value)
final_result = {}
for category, data in result.items():
if data['count'] > 0:
final_result[category] = data['total'] / data['count']
if data['strings']:
final_result[category] = ','.join(data['strings']) if 'count' not in final_result[category] else \
str(final_result[category]) + ',' + ','.join(data['strings'])
return final_result
你可以使用以下方式调用这个函数:
data = [
{'category': 'A', 'value': 1},
{'category': 'A', 'value': 2},
{'category': 'B', 'value': 'apple'},
{'category': 'B', 'value': 'banana'},
{'category': 'A', 'value': 3}
]
print(aggregate_data(data))
代码解释
- 初始化结果字典:
- 使用
defaultdict
来初始化result
字典,defaultdict
的默认值是一个字典,这个字典用于记录每个类别下数值的计数和总和,以及字符串的列表。
- 使用
- 遍历数据列表:
- 对于每个字典,根据
category
来更新result
字典。如果value
是数值类型,更新计数和总和;如果是字符串类型,将其添加到字符串列表中。
- 对于每个字典,根据
- 生成最终结果:
- 遍历
result
字典,对于有数值的类别,计算平均值;对于有字符串的类别,将字符串拼接起来。如果一个类别既有数值又有字符串,先将数值转为字符串再与字符串拼接。
- 遍历
- 示例调用:
- 定义一个示例数据列表并调用
aggregate_data
函数输出结果。
- 定义一个示例数据列表并调用