python3列表理解求和和与连接

2024-09-30 06:21:15 发布

您现在位置:Python中文网/ 问答频道 /正文

mylist =[[16, 'August', 2014, 540, 10], [16, 'Iunie', 2014, 100, 20], [23,'August', 2014, 540,10], [23,'Septembrie', 2016, 540,30], [21,'August', 2014, 422, 30]]

我想要实现的是:

^{pr2}$

为了解释这一点,在mylist(list of list)中,当索引0(第一个元素)找到相同的value元素(在我的示例16===16)时,我要检查每个列表,并执行以下操作:只保留第一个列表并将其累加到index 1+index 2(如此示例->;'August',2014和'Iunie',2014到'August 2014,Iunie 2014’)并求和指数4(如我的示例20+10)。在

我设法做到了:

^{3}$

但这将产生:

[[16, 'August', 2014, 540, 10], [23, 'August', 2014, 540, 10], [21, 'August', 2014, 422, 30]]

为了进行我想要的计算,我还需要添加什么?,我使用python3。非常感谢你!在


Tags: ofgt元素示例列表indexvalue指数
3条回答

这是相当冗长的,但我觉得它必须是,可理解\可读的

mylist = [[16, 'August', 2014, 540, 10], [16, 'Iunie', 2014, 100, 20], [23, 'August', 2014, 540, 10], [23, 'Septembrie', 2016, 540, 30], [21, 'August', 2014, 422, 30]]

g = {}
for x, *y in mylist:
    g.setdefault(x, []).append(y)

def formater(obj, a_list):
    if len(a_list) == 1:
        return [obj] + a_list[0]
    else:
        conc = ', '.join('{} {}'.format(sub[0], sub[1]) for sub in a_list)
        return [obj, conc, a_list[0][2], sum(sub[3] for sub in a_list)]

manipulate = [formater(k, v) for k, v in g.items()]
print(manipulate)  # [[16, 'August 2014, Iunie 2014', 540, 30], [21, 'August', 2014, 422, 30], [23, 'August 2014, Septembrie 2016', 540, 40]]

假设列表已经按第一个元素排序,可以使用itertools.groupby对元素进行分组,然后组合新的子列表。在

manipulate = []
for group in (list(g) for k, g in itertools.groupby(mylist, key=lambda x: x[0])):
    lst = [group[0][0]] + [x for g in group for x in g[1:3]] + [group[0][3]] + [sum(g[-1] for g in group)]
    manipulate.append(lst)

如果你想的话,你甚至可以把这些列在一个可怕的清单里。。。在

^{pr2}$

结果是这样的(我不合并字符串,因为我不确定您的真正意思是这样):

[[16, 'August', 2014, 'Iunie', 2014, 540, 30], 
 [23, 'August', 2014, 'Septembrie', 2016, 540, 40], 
 [21, 'August', 2014, 422, 30]]

如果要合并日期,请使用以下稍微更糟糕的列表理解:

manipulate = [[group[0][0]] + [', '.join(' '.join(map(str, g[1:3])) for g in group)] + [group[0][3]] + [sum(g[-1] for g in group)]
              for group in (list(g) for k, g in itertools.groupby(mylist, key=lambda x: x[0]))]

这样,结果是:

[[16, 'August 2014, Iunie 2014', 540, 30], 
 [23, 'August 2014, Septembrie 2016', 540, 40], 
 [21, 'August 2014', 422, 30]]

这适用于每个组中任意数量的元素。如果子列表不是按第一个元素排序的,请先对它们排序,或者使用字典进行分组。在

你可以试试这个:

mylist =[[16, 'August', 2014, 540, 10], [16, 'Iunie', 2014, 100, 20], [23,'August', 2014, 540,10], [23,'Septembrie', 2016, 540,30], [21,'August', 2014, 422, 30]]

new_list = [[mylist[i][0]]+[mylist[i][1]+" "+str(mylist[i][2])]+mylist[i][3:] for i in range(len(mylist))]

final_lists = [[c+", "+d if isinstance(c, str) and isinstance(d, str)  else c+d if c != d else c for c, d in zip(new_list[i], new_list[i+1])] for i in range(0, len(new_list)-1, 2)]+mylist[-1]

相关问题 更多 >

    热门问题