【作業幫】(數據開發工程師-面試)統計字符串出現的次數以及其對應的值的和【Python】
題目描述
已知列表如下,統計列表中第一列中的字符串出現的次數以及其對應值的和
a,1
b,2
c,3
a,2
b,3
輸出
[[‘b’, 2, 5], [‘c’, 1, 3], [‘a’, 2, 3]]
方法一:最直觀,‘簡單’(當下只能想到這樣的笨辦法…)
# 列表
A = [['a',1],['b',2],['c',3],['a',2],['b',3]]
L = []
# 將第一列提取爲列表
for i in range(len(A)):
L.append(A[i][0])
# print(L)
# 使用集合去重複
SA = set(L)
# print (SA)
Pr = []
# 統計每個字符串出現的次數
for a in SA:
Pr.append(L.count(a))
# print(Pr)
# 將集合轉換爲列表
SA2 = list(SA)
# print ('SA2',SA2)
# 創建空列表
Last = [[0]*len(SA2) for i in range(3)]
for i in range(len(Pr)):
Last[i][0],Last[i][1] = SA2[i],Pr[i]
sum = 0
for x in range (len(A)):
if SA2[i] == A[x][0]:
sum += A[x][1]
Last[i][2] = sum
print (Last)
面試結束後查詢了字典(鍵值對)相加的相關方法,如下:
字典求和
題目:python合併字典,相同的key的value如何相加
使用函數實現,結合reduce函數實現多個相加
使用類實現加號對不限制個數的字典相加
'''
1 方法單個相加實現
'''
x = {'apple': 1, 'banana': 2}
y = {'banana': 10, 'pear': 11}
def func(dict1, dict2):
for i, j in dict2.items():
if i in dict1.keys():
dict1[i] += j
else:
dict1[i] = j
# 或:
# dict1.update({f'{i}': dict2[i]})
return dict1
print(func(x, y))
'''
2 方法多個相加的實現
'''
from functools import reduce
x = {'apple': 1, 'banana': 2}
y = {'banana': 10, 'pear': 11}
z = {'pear': 5, 'tudou': 22}
def func(dict1, dict2):
for i, j in dict2.items():
if i in dict1.keys():
dict1[i] += j
else:
dict1.update({f'{i}': dict2[i]})
return dict1
print(reduce(func, [x, y, z]))
'''
3 使用面向對象來實現多個相加
'''
x = {'apple': 1, 'banana': 2}
y = {'banana': 10, 'pear': 11}
z = {'pear': 5, 'tudou': 22}
class Fruit(object):
def __init__(self, kwargs):
dict1 = kwargs
self.mydict = kwargs
for i, j in kwargs.items():
# self.i = j #返回self.2 = 10 ;此語句無法成功賦值,故隱藏
setattr(self, i, j) # 其實就是考察setattr函數知不知道
def __add__(self, other):
for m, n in other.mydict.items():
if m in self.mydict.keys():
self.mydict[m] += n
else:
self.mydict.update({f'{m}': other.mydict[m]})
result = self.mydict
return Fruit(result)
if __name__ == '__main__':
x = Fruit(x) + Fruit(y) + Fruit(z)
print(x.mydict)
print(x.banana)
'''
結果:
{'apple': 1, 'banana': 12, 'pear': 16, 'tudou': 22}
'''
列表內字典值相加
info= [{'name':'apple','value':2},{'name':'orange','value':5},{'name':'apple','value':5}]
info_dic={}
print (info_dic)
for d in info:
if d['name'] not in info_dic:
info_dic[d['name']]=d['value']
else: info_dic[d['name']]+=d['value']
new_info=[]
for n,v in info_dic.items():
new_info.append({'name':n,'value':v})
print(new_info)
列表,使用字典方法實現對應值相加
考慮還是想對列表內的字符串對應的值想加。但是無法統計字符串出現的順序
info= [{'name':'apple','value':2},{'name':'orange','value':5},{'name':'apple','value':5}]
info_dic={}
print (info_dic)
for d in info:
if d['name'] not in info_dic:
info_dic[d['name']]=d['value']
else: info_dic[d['name']]+=d['value']
new_info=[]
for n,v in info_dic.items():
new_info.append({'name':n,'value':v})
print(new_info)