Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3列表理解求和和和连接_Python_Python 3.x_List - Fatal编程技术网

Python3列表理解求和和和连接

Python3列表理解求和和和连接,python,python-3.x,list,Python,Python 3.x,List,我想要实现的是: 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]] 为了解释这一点,在mylist(列表列表列表)中,我希望在找到相同的值元素(在我的示例中为16==16)时检查每个列表的索引0(第一个元素),并执行休整操作

我想要实现的是:

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]]
为了解释这一点,在mylist(列表列表列表)中,我希望在找到相同的值元素(在我的示例中为16==16)时检查每个列表的索引0(第一个元素),并执行休整操作:仅保留第一个列表,并将其累积到索引1+索引2(如本例->“2014年8月”和“2014年8月,2014年Iunie”中)并将索引4求和(如我的示例20+10)

我设法做到这一点:

manipulate = [[16, 'August 2014, Iunie 2014', 540, 30], [23, 'August 2014, Septembrie 2016', 540, 40], [21, 'August', 2014, 422, 30]]
但这将产生:

manipulate=[i for i in mylist if i[0] not in [mylist[idx][0] for idx in range(0,mylist.index(i))]]

为了完成我想要的计算,我必须添加什么?我使用Python3。非常感谢你

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

[[16, 'August', 2014, 540, 10], [23, 'August', 2014, 540, 10], [21, 'August', 2014, 422, 30]]
如果你想的话,你甚至可以把它们放在一个可怕的列表中

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)
结果是这样的(我不合并字符串,因为我不确定您是否真的是这个意思):

如果要合并日期,请使用以下更可怕的列表:

[[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]))]

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

这非常详细,但我觉得必须这样,才能理解\可读:

您可以尝试以下方法:

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]]

它必须是一个列表吗?不一定!是否可以有两个以上的列表匹配?还有,你保留了索引3中的哪一项?是的,列表中可能有2个以上,我只保留了第一个(索引3)。我敦促你重新考虑你的期望输出,因为这非常难看,不一致,也不太实用。这与期望输出不完全匹配。字符串串接位留在外部。@Ev.Kounis同意,我不确定这是故意的还是人工伪造输出的产物。例如,在最后一段中,它仍然是
[21',2014,422,30]
,而不是
[21',2014,422,30]
这最后一段我也不同意,但因为这是OP想要的。我也将测试这一点,非常感谢tobias!看起来不错,非常感谢,它只漏掉了“2014年8月Iunie 2014”的逗号。我添加了一个新列表:[16,“Octombrie”,2014,540,100],现在输出结果如下:[[16,'2014年8月,Octombrie 2014',540,110],[39,'Iunie 2014,2014年8月,640,30],[44,'Septmbrie 2016,2014年8月,962,30],21,'2014年8月,422,30]而不是[[16',2014年8月,2014年8月,2014年8月,540,130],[39',2014年8月,2014年8月,640,30],[44',2016年9月,2014年8月,962,30],[21',2014年8月,422,30]。谢谢你,我还有更多的元素将具有相同的索引0。是的,非常感谢你,这很有效,我会接受这个答案,因为这是最快的有效答案。再次感谢先生:),我会在家里测试更多。你能不能,伊夫。Kounis Exaplane你在这里做什么:一张清单[0][2]
[[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]]

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]]
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]