我有一个包含['Country-Points']
字符串的列表。
例如:
lst = ['Albania-10', 'Albania-5', 'Andorra-0', 'Andorra-4', 'Andorra-8', ...other countries...]
我想在不创建新列表的情况下计算每个国家/地区的平均值。所以输出将是(在上面的情况下):
lst = ['Albania-7.5', 'Andorra-4.25', ...other countries...]
如果有人能帮助我,我真的很感激。
编辑: 这是我到目前为止所得到的。因此,“数据”实际上是一个字典,其中键是国家,值是这个国家的其他国家点的列表(一个作为键)。同样,我是Python的新手,所以我不知道所有的内置函数。
for key in self.data:
lst = []
index = 0
score = 0
cnt = 0
s = str(self.data[key][0]).split("-")[0]
for i in range(len(self.data[key])):
if s in self.data[key][i]:
a = str(self.data[key][i]).split("-")
score += int(float(a[1]))
cnt+=1
index+=1
if i+1 != len(self.data[key]) and not s in self.data[key][i+1]:
lst.append(s + "-" + str(float(score/cnt)))
s = str(self.data[key][index]).split("-")[0]
score = 0
self.data[key] = lst
答案 0 :(得分:4)
itertools.groupby
可以提供帮助:
import itertools
def get_country_name(item):
return item.split('-', 1)[0]
def get_country_value(item):
return float(item.split('-', 1)[1])
def country_avg_grouper(lst) :
for ctry, group in itertools.groupby(lst, key=get_country_name):
values = list(get_country_value(c) for c in group)
avg = sum(values)/len(values)
yield '{country}-{avg}'.format(country=ctry, avg=avg)
lst[:] = country_avg_grouper(lst)
这里的关键是我编写了一个函数来进行更改不合适然后我可以通过使用切片赋值轻松地使替换发生到位。 / p>
答案 1 :(得分:0)
我可能会用中间词典来做这件事。
def country(s):
return s.split('-')[0]
def value(s):
return float(s.split('-')[1])
def country_average(lst):
country_map = {}|
for point in lst:
c = country(pair)
v = value(pair)
old = country_map.get(c, (0, 0))
country_map[c] = (old[0]+v, old[1]+1)
return ['%s-%f' % (country, sum/count)
for (country, (sum, count)) in country_map.items()]
它只努力只遍历原始列表一次,代价是相当多的元组分配。