关于 Python 元组操作
About Python tuples manipulation
我有一个元组列表,每个元组都有一个字符串和一个整数值:
list_a= [('0', 60), ('0', 5), ('2', 1), ('3', 14), ('4', 39), ('1', 17), ('2', 14), ('2', 29), ('4', 1), ('3', 1), ('3', 16), ('4', 8)]
如果字符串相同且仅当字符串彼此相邻时,我想添加值,使输出看起来像:
result=[('0', 65), ('2', 1), ('3', 14), ('4', 39), ('1', 17), ('2', 43), ('4', 1), ('3', 17), ('4', 8)]
没有使用任何导入的包
您可以尝试以下方法;累积值直到“键”发生变化:
list_a = [('0', 60), ('0', 5), ('2', 1), ('3', 14), ('4', 39), ('1', 17), ('2', 14), ('2', 29), ('4', 1), ('3', 1), ('3', 16), ('4', 8)]
output = []
v_accu = 0 # value accumulator
k_prev = None
for k, v in list_a:
if k_prev is not None and k != k_prev: # can omit "is not None"
output.append((k_prev, v_accu)) # insert the accumulated value so far
v_accu = v # reset the accumulator
else:
v_accu += v # keep adding
k_prev = k # update k_prev
output.append((k_prev, v_accu)) # final insertion
print(output)
# [('0', 65), ('2', 1), ('3', 14), ('4', 39), ('1', 17), ('2', 43), ('4', 1), ('3', 17), ('4', 8)]
但是对于一些标准模块,你可以用更简单的方式来做:
from itertools import groupby
from operator import itemgetter
list_a = [('0', 60), ('0', 5), ('2', 1), ('3', 14), ('4', 39), ('1', 17), ('2', 14), ('2', 29), ('4', 1), ('3', 1), ('3', 16), ('4', 8)]
output = [(k, sum(map(itemgetter(1), g))) for k, g in groupby(list_a, key=itemgetter(0))]
print(output)
我有一个元组列表,每个元组都有一个字符串和一个整数值:
list_a= [('0', 60), ('0', 5), ('2', 1), ('3', 14), ('4', 39), ('1', 17), ('2', 14), ('2', 29), ('4', 1), ('3', 1), ('3', 16), ('4', 8)]
如果字符串相同且仅当字符串彼此相邻时,我想添加值,使输出看起来像:
result=[('0', 65), ('2', 1), ('3', 14), ('4', 39), ('1', 17), ('2', 43), ('4', 1), ('3', 17), ('4', 8)]
没有使用任何导入的包
您可以尝试以下方法;累积值直到“键”发生变化:
list_a = [('0', 60), ('0', 5), ('2', 1), ('3', 14), ('4', 39), ('1', 17), ('2', 14), ('2', 29), ('4', 1), ('3', 1), ('3', 16), ('4', 8)]
output = []
v_accu = 0 # value accumulator
k_prev = None
for k, v in list_a:
if k_prev is not None and k != k_prev: # can omit "is not None"
output.append((k_prev, v_accu)) # insert the accumulated value so far
v_accu = v # reset the accumulator
else:
v_accu += v # keep adding
k_prev = k # update k_prev
output.append((k_prev, v_accu)) # final insertion
print(output)
# [('0', 65), ('2', 1), ('3', 14), ('4', 39), ('1', 17), ('2', 43), ('4', 1), ('3', 17), ('4', 8)]
但是对于一些标准模块,你可以用更简单的方式来做:
from itertools import groupby
from operator import itemgetter
list_a = [('0', 60), ('0', 5), ('2', 1), ('3', 14), ('4', 39), ('1', 17), ('2', 14), ('2', 29), ('4', 1), ('3', 1), ('3', 16), ('4', 8)]
output = [(k, sum(map(itemgetter(1), g))) for k, g in groupby(list_a, key=itemgetter(0))]
print(output)