在python中,如何基于一个键将元素分组在一起(分组相邻)?

在python中,如何基于一个键将元素分组在一起(分组相邻)?,python,arrays,lambda,split,Python,Arrays,Lambda,Split,在python中,我希望根据键将元素分组在一起(在下面的示例中,键是第二个元素,或者element[1]) 只有键相同且相邻的元素才应分组在一起 splited_array = [ [[10, 0], [30, 0]], [[40, 2], [20, 2]], [[90, 0], [80, 0]] ] 此外,我希望导致拆分的元素也位于前一个数组的末尾 splited_array = [ [[10, 0], [30, 0

python
中,我希望根据键将元素分组在一起(在下面的示例中,键是第二个元素,或者
element[1]

只有键相同且相邻的元素才应分组在一起

splited_array = [ [[10, 0], [30, 0]], 
                  [[40, 2], [20, 2]], 
                  [[90, 0], [80, 0]] ]
此外,我希望导致拆分的元素也位于前一个数组的末尾

splited_array = [ [[10, 0], [30, 0], [40, 2]], 
                  [[40, 2], [20, 2], [90, 0]], 
                  [[90, 0], [80, 0]] ]

在python中,最简单的方法是什么?(如果可能,请重新使用)

您可以使用
itertools.groupby

>>> from itertools import groupby
>>> from operator import itemgetter
>>> lis = [[10, 0], [30, 0], [40, 2], [20, 2], [90, 0], [80, 0]]
>>> [list(g) for k,g in groupby(lis, key=itemgetter(1))]
[[[10, 0], [30, 0]],
 [[40, 2], [20, 2]],
 [[90, 0], [80, 0]]]
第二个:

>>> ans = []
for k,g in groupby(lis, key=itemgetter(1)):
    l = list(g)
    ans.append(l)
    if len(ans) > 1:
        ans[-2].append(l[0])
...         
>>> ans
[[[10, 0], [30, 0], [40, 2]],
 [[40, 2], [20, 2], [90, 0]],
 [[90, 0], [80, 0]]]
更新:

>>> from itertools import zip_longest
>>> lis = [[[10, 0], [30, 0]],
 [[40, 2], [20, 2]],
 [[90, 0], [80, 0]]]
>>> [x + ([y[0]] if y else []) for x,y in 
                                        zip_longest(lis,lis[1:])]
[[[10, 0], [30, 0], [40, 2]],
 [[40, 2], [20, 2], [90, 0]],
 [[90, 0], [80, 0]]]

对于那些对itemgetter(i)=lambda x:x[i]@AshwiniChaudhary好奇的人,我只是在读你(优秀的)答案。对于第二部分,是否有一种方法可以以不太强制的方式做到这一点,例如:不修改全局状态(ans变量),而是使用一组函数来获取并返回新的数据集(就像groupby()函数一样)。希望你明白我的意思。谢谢你的快速回答。这就是我要找的。无论如何,在Blender 2.67(Python 3.3)下执行“从itertools导入izip_longest”时,我得到了“ImportError:无法导入名称izip_longest”。我在ideone.com(支持Python 3的在线编译器)下尝试了相同的代码,但得到了相同的错误消息。有什么想法吗?@tigrou在py3.x中使用
zip\u longest
>>> from itertools import zip_longest
>>> lis = [[[10, 0], [30, 0]],
 [[40, 2], [20, 2]],
 [[90, 0], [80, 0]]]
>>> [x + ([y[0]] if y else []) for x,y in 
                                        zip_longest(lis,lis[1:])]
[[[10, 0], [30, 0], [40, 2]],
 [[40, 2], [20, 2], [90, 0]],
 [[90, 0], [80, 0]]]