Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
Python2按值合并列表_Python_List - Fatal编程技术网

Python2按值合并列表

Python2按值合并列表,python,list,Python,List,我有一个包含4个元素的列表,它看起来像: L = [['grape','green',2, 100], ['grape','purple',3,3], ['apple','red',2, 15], ['apple','greed',3, 10], ['apple','red',4, 4], ['banana','yellow',2, 3]] 我想使用一个函数,通过第一个元素合并该列表,连接第二个和第三个元素,然后对最后一个元素求和,得到如下输出: [['grape',['green,

我有一个包含4个元素的列表,它看起来像:

L = [['grape','green',2, 100], ['grape','purple',3,3], ['apple','red',2, 15], ['apple','greed',3, 10],
     ['apple','red',4, 4], ['banana','yellow',2, 3]]
我想使用一个函数,通过第一个元素合并该列表,连接第二个和第三个元素,然后对最后一个元素求和,得到如下输出:

[['grape',['green,purple'],[2,3],103],['banana','yellow',2, 3],['apple',['red','green','red'],[2,3,4],29]
我尝试了以下代码:

[(x,sum(map(itemgetter(3),y))) for x,y in itertools.groupby(L, itemgetter(0))], which can successfully sum up the last element, but

[(x,(map(itemgetter(1),y)),(map(itemgetter(2),y)),sum(map(itemgetter(3),y))) for x,y in itertools.groupby(L, itemgetter(0))]
没有像我预期的那样工作


有什么方法可以做到这一点吗?

使用
itertools.groupby()
您需要两个单独的迭代:

In [20]: [[i[0], j, k, sum(z)] for i, j, k, z in [zip(*g) for _, g in groupby(L, itemgetter(0))]]
Out[20]: 
[['grape', ('green', 'purple'), (2, 3), 103],
 ['apple', ('red', 'greed', 'red'), (2, 3, 4), 29],
 ['banana', ('yellow',), (2,), 3]]
下面是使用
collections.defaultdict
的另一种方法,但不是优化:

In [34]: d = defaultdict(list)

In [35]: for i, j, k, z in L:
            d[i].append((j, k, z))
   ....:     

In [36]: [[i, j, k, sum(z)] for i, j, k, z in [[i, *zip(*values)] for i, values in d.items()]]
Out[36]: 
[['banana', ('yellow',), (2,), 3],
 ['apple', ('red', 'greed', 'red'), (2, 3, 4), 29],
 ['grape', ('green', 'purple'), (2, 3), 103]]

请注意,列表中的
*zip(…)
称为就地解包,仅在python 3.5+中可用。

另一个基于
groupby
的解决方案,稍微少了一些纠结,并准确地给出了请求的输出:

import operator, itertools

l = [['grape','green',2, 100], ['grape','purple',3,3], ['apple','red',2, 15], ['apple','greed',3, 10],
     ['apple','red',4, 4], ['banana','yellow',2, 3]]


res = []
for key, group in itertools.groupby(l, operator.itemgetter(0)):
    i,j,k,l = [i[0] if len(i) == 1 else list(i) for i in zip(*group)]
    res.append([key, j, k, l if type(l) == int else sum(l)])

print(res)
输出:

[['grape', ['green', 'purple'], [2, 3], 103], ['apple', ['red', 'greed', 'red'], [2, 3, 4], 29], ['banana', 'yellow', 2, 3]]

请注意,这里的结果是
['banana',('yellow',),(2,),3]
,而不是问题中的
['banana','yellow',2,3]
。@niemmi是的,但让我们把它作为OP的任务;)如果组中只有一个项目,那么结果中的第二个和第三个元素应该是列表吗?列表或未列表(元素)都将被选中,谢谢!这是一个安全的方法!