如何根据条件对嵌套列表的元素求和?
How to sum elements of nested list based on condition?
我有一个如下所示的嵌套列表,我试图将第 1 列的值与第 2 列中的相同值相加,并添加
一个带有总和的新子列表和另一个带有“总计”的子列表。
a = [
['45', '00128'],
['88', '00128'],
['87', '00128'],
['50', '88292'],
['69', '88292'],
['70', '72415'],
['93', '72415'],
['79', '72415']
]
我当前的代码如下所示,我想它会在列表 a
上运行某些内容,但不会更改 a
.
中的任何内容
for sl in a:
x = sl[1]; c0=0
if (sl[1] == x):
c0 = c0 + int(sl[0])
else:
a.insert(a.index(sl)+1,[c0,''])
a.insert(a.index(sl)+2,['Total',''])
我正在寻找的输出是这样的:
b = [
['45', '00128'],
['88', '00128'],
['87', '00128'],
['220', ''], # This is 45 + 88 + 87
['Total', ''],
['50', '88292'],
['69', '88292'],
['119', ''], # This is 50 + 69
['Total', ''],
['70', '72415'],
['93', '72415'],
['79', '72415'],
['242', ''], # This is 70 + 93 + 79
['Total', '']
]
如何做到这一点?谢谢
更新
包含 4 列的输入列表,例如左侧的一列,需要对 col1、col3 和 col4 求和以获得最右边的一列。
a = [ >> b = [
['45', '00128', '2','4'], >> ['45', '00128', '2', '4' ],
['88', '00128', '1','3'], >> ['88', '00128', '1', '3' ],
['87', '00128', '4','0'], >> ['87', '00128', '4', '0' ],
['50', '88292', '1','1'], >> ['220', '' , '7', '7' ],
['69', '88292', '9','5'], >> ['Total', '', 'Total', 'Total'],
['70', '72415', '8','9'], >> ['50', '88292', '1', '1' ],
['93', '72415', '3','2'], >> ['69', '88292', '9', '5' ],
['79', '72415', '5','7'] >> ['119', '', '10', '6' ],
] >> ['Total', '', 'Total', 'Total'],
>> ['70', '72415', '8', '9' ],
>> ['93', '72415', '3', '2' ],
>> ['79', '72415', '5', '7' ],
>> ['242', '', '16', '18' ],
>> ['Total', '', 'Total', 'Total'],
>> ]
您似乎从电子表格中导入了数据?一种非常简洁的方法是使用 pandas
库,让它为您处理数据:
a = [
['45', '00128'],
['88', '00128'],
['87', '00128'],
['50', '88292'],
['69', '88292'],
['70', '72415'],
['93', '72415'],
['79', '72415']
]
# Import the library
import pandas as pd
# Put data into a pandas DataFrame and set column names
df = pd.DataFrame(a, columns=['value', 'category'])
# Change `value` column to integers
df['value'] = df['value'].astype(int)
# Group by the `category` column and sum
sum_df = df.groupby('category').sum()
# Show answer
print(sum_df)
应打印出以下内容:
value
category
00128 220
72415 242
88292 119
使用itertools.groupby
from itertools import groupby
result = []
for m,n in groupby(a, lambda x: x[1]):
n = list(n)
result.extend(n + [[sum(int(i) for i, _ in n), ""]])
print(result)
输出:
[['45', '00128'],
['88', '00128'],
['87', '00128'],
[220, ''],
['50', '88292'],
['69', '88292'],
[119, ''],
['70', '72415'],
['93', '72415'],
['79', '72415'],
[242, '']]
根据评论编辑
for m,n in groupby(a, lambda x: x[1]):
n = list(n)
val_1, val_2, val_3 = 0, 0, 0
for i in n:
val_1 += int(i[0])
#val_2, val_3....
result.extend(n + [[val_1, ""]])
如果可以用numpy
那么0轴求和就更简单了
例如:
for m,n in groupby(a, lambda x: x[1]):
n = np.array(list(n), dtype=int)
print(np.delete(np.sum(n, axis=0), 1))
np.delete --> Delete element in index 1
np.sum with axis=0 --> sum element in column.
一种非常原始的方式。这仅用于知识目的。我会推荐 Rakesh
给出的答案
from collections import defaultdict
sums_dict = defaultdict(int)
a = [
['45', '00128'],
['88', '00128'],
['87', '00128'],
['50', '88292'],
['69', '88292'],
['70', '72415'],
['93', '72415'],
['79', '72415']
]
sums_dict = {v:sums_dict[v]+int(k) for k,v in a}
for k in sums_dict:
index = next((len(a) - i - 1 for i, lst in enumerate(reversed(a)) if k in lst), -1)
a.insert(index, [str(sums_dict[k]),""])
a.insert(index+2, ['Total', ''])
print(a)
输出:
[['45', '00128'], ['88', '00128'], ['87', ''], ['87', '00128'], ['Total', ''], ['50', '88292'], ['69', ''], ['69', '88292'], ['Total', ''], ['70', '72415'], ['93', '72415'], ['79', ''], ['79', '72415'], ['Total', '']]
我有一个如下所示的嵌套列表,我试图将第 1 列的值与第 2 列中的相同值相加,并添加 一个带有总和的新子列表和另一个带有“总计”的子列表。
a = [
['45', '00128'],
['88', '00128'],
['87', '00128'],
['50', '88292'],
['69', '88292'],
['70', '72415'],
['93', '72415'],
['79', '72415']
]
我当前的代码如下所示,我想它会在列表 a
上运行某些内容,但不会更改 a
.
for sl in a:
x = sl[1]; c0=0
if (sl[1] == x):
c0 = c0 + int(sl[0])
else:
a.insert(a.index(sl)+1,[c0,''])
a.insert(a.index(sl)+2,['Total',''])
我正在寻找的输出是这样的:
b = [
['45', '00128'],
['88', '00128'],
['87', '00128'],
['220', ''], # This is 45 + 88 + 87
['Total', ''],
['50', '88292'],
['69', '88292'],
['119', ''], # This is 50 + 69
['Total', ''],
['70', '72415'],
['93', '72415'],
['79', '72415'],
['242', ''], # This is 70 + 93 + 79
['Total', '']
]
如何做到这一点?谢谢
更新
包含 4 列的输入列表,例如左侧的一列,需要对 col1、col3 和 col4 求和以获得最右边的一列。
a = [ >> b = [
['45', '00128', '2','4'], >> ['45', '00128', '2', '4' ],
['88', '00128', '1','3'], >> ['88', '00128', '1', '3' ],
['87', '00128', '4','0'], >> ['87', '00128', '4', '0' ],
['50', '88292', '1','1'], >> ['220', '' , '7', '7' ],
['69', '88292', '9','5'], >> ['Total', '', 'Total', 'Total'],
['70', '72415', '8','9'], >> ['50', '88292', '1', '1' ],
['93', '72415', '3','2'], >> ['69', '88292', '9', '5' ],
['79', '72415', '5','7'] >> ['119', '', '10', '6' ],
] >> ['Total', '', 'Total', 'Total'],
>> ['70', '72415', '8', '9' ],
>> ['93', '72415', '3', '2' ],
>> ['79', '72415', '5', '7' ],
>> ['242', '', '16', '18' ],
>> ['Total', '', 'Total', 'Total'],
>> ]
您似乎从电子表格中导入了数据?一种非常简洁的方法是使用 pandas
库,让它为您处理数据:
a = [
['45', '00128'],
['88', '00128'],
['87', '00128'],
['50', '88292'],
['69', '88292'],
['70', '72415'],
['93', '72415'],
['79', '72415']
]
# Import the library
import pandas as pd
# Put data into a pandas DataFrame and set column names
df = pd.DataFrame(a, columns=['value', 'category'])
# Change `value` column to integers
df['value'] = df['value'].astype(int)
# Group by the `category` column and sum
sum_df = df.groupby('category').sum()
# Show answer
print(sum_df)
应打印出以下内容:
value
category
00128 220
72415 242
88292 119
使用itertools.groupby
from itertools import groupby
result = []
for m,n in groupby(a, lambda x: x[1]):
n = list(n)
result.extend(n + [[sum(int(i) for i, _ in n), ""]])
print(result)
输出:
[['45', '00128'],
['88', '00128'],
['87', '00128'],
[220, ''],
['50', '88292'],
['69', '88292'],
[119, ''],
['70', '72415'],
['93', '72415'],
['79', '72415'],
[242, '']]
根据评论编辑
for m,n in groupby(a, lambda x: x[1]):
n = list(n)
val_1, val_2, val_3 = 0, 0, 0
for i in n:
val_1 += int(i[0])
#val_2, val_3....
result.extend(n + [[val_1, ""]])
如果可以用numpy
那么0轴求和就更简单了
例如:
for m,n in groupby(a, lambda x: x[1]):
n = np.array(list(n), dtype=int)
print(np.delete(np.sum(n, axis=0), 1))
np.delete --> Delete element in index 1
np.sum with axis=0 --> sum element in column.
一种非常原始的方式。这仅用于知识目的。我会推荐 Rakesh
给出的答案from collections import defaultdict
sums_dict = defaultdict(int)
a = [
['45', '00128'],
['88', '00128'],
['87', '00128'],
['50', '88292'],
['69', '88292'],
['70', '72415'],
['93', '72415'],
['79', '72415']
]
sums_dict = {v:sums_dict[v]+int(k) for k,v in a}
for k in sums_dict:
index = next((len(a) - i - 1 for i, lst in enumerate(reversed(a)) if k in lst), -1)
a.insert(index, [str(sums_dict[k]),""])
a.insert(index+2, ['Total', ''])
print(a)
输出:
[['45', '00128'], ['88', '00128'], ['87', ''], ['87', '00128'], ['Total', ''], ['50', '88292'], ['69', ''], ['69', '88292'], ['Total', ''], ['70', '72415'], ['93', '72415'], ['79', ''], ['79', '72415'], ['Total', '']]