首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据条件和嵌套列表中的元素?

如何根据条件和嵌套列表中的元素?
EN

Stack Overflow用户
提问于 2020-07-13 06:02:34
回答 3查看 359关注 0票数 2

我有一个嵌套列表,如下所示,我试图将第1列的值与第2列中的相同值相加,并将一个新的子列表与sum相加,另一个子列表添加"Total“。

代码语言:javascript
运行
复制
a = [
        ['45', '00128'], 
        ['88', '00128'], 
        ['87', '00128'], 
        ['50', '88292'], 
        ['69', '88292'], 
        ['70', '72415'], 
        ['93', '72415'], 
        ['79', '72415']
    ]

我的当前代码如下所示,我认为这将对列表a进行操作,但不会更改a中的任何内容。

代码语言:javascript
运行
复制
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',''])        

我要寻找的输出如下:

代码语言:javascript
运行
复制
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相加,才能将其精确化。

代码语言:javascript
运行
复制
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'],
                                   >>       ]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-13 06:14:47

使用itertools.groupby

代码语言:javascript
运行
复制
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)

输出:

代码语言:javascript
运行
复制
[['45', '00128'],
 ['88', '00128'],
 ['87', '00128'],
 [220, ''],
 ['50', '88292'],
 ['69', '88292'],
 [119, ''],
 ['70', '72415'],
 ['93', '72415'],
 ['79', '72415'],
 [242, '']]

按注释编辑

代码语言:javascript
运行
复制
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的和就更简单了。

Ex:

代码语言:javascript
运行
复制
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))

代码语言:javascript
运行
复制
np.delete --> Delete element in index 1
np.sum with axis=0 --> sum element in column. 
票数 3
EN

Stack Overflow用户

发布于 2020-07-13 06:09:42

看起来您从电子表格中导入了数据?要做到这一点,一种非常干净的方法是使用pandas库,让它为您处理数据争用:

代码语言:javascript
运行
复制
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)

应打印以下内容:

代码语言:javascript
运行
复制
          value
category
00128       220
72415       242
88292       119
票数 0
EN

Stack Overflow用户

发布于 2020-07-13 06:29:00

一种相当原始的方法。这只是为了知识的目的。我会推荐Rakesh给出的答案

代码语言:javascript
运行
复制
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)

输出:

代码语言:javascript
运行
复制
[['45', '00128'], ['88', '00128'], ['87', ''], ['87', '00128'], ['Total', ''], ['50', '88292'], ['69', ''], ['69', '88292'], ['Total', ''], ['70', '72415'], ['93', '72415'], ['79', ''], ['79', '72415'], ['Total', '']]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62870046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档