我在 Python 中有一个像这样的元组 -
a = ((-,-,x), (-,-,x), (-,-,y), (-,-,z), (-,-,z), (-,-,z))
现在,我想将具有相同第三个元素的元组分组。我必须将这个元组,a 转换为
b = (((-,-,x), (-,-,x)), ((-,-,y)), ((-,-,z), (-,-,z), (-,-,z)))
如何为此编写 Python 代码?将 a
转换为 b
?由于元组是不可变的,我无法成功编写代码。
最佳答案
这可以通过 itertools.groupby
来完成.
>>> from operator import itemgetter
>>> from itertools import groupby
>>>
>>> a = (('-','-','x'), ('-','-','x'), ('-','-','y'), ('-','-','z'), ('-','-','z'), ('-','-','z'))
>>> tuple(tuple(grp) for _, grp in groupby(a, key=itemgetter(-1)))
>>>
((('-', '-', 'x'), ('-', '-', 'x')),
(('-', '-', 'y'),),
(('-', '-', 'z'), ('-', '-', 'z'), ('-', '-', 'z')))
假设最后一个元素相等的组不能被中断(就像在示例数据中一样)。如果可以,您需要先使用 key=itemgetter(-1)
对 a
进行排序。
当然。我的意思是...can you explain "interrupted"?
groupby
将连续元素组合在一起,其中 key
返回相同的值。所以如果我们有类似的东西
b = (('-','-','z'), ('-', '-', 'x'), ('-','-','z'))
然后上面的 groupby
将创建三个组,而不是两个。
>>> b = (('-','-','z'), ('-', '-', 'x'), ('-','-','z'))
>>> tuple(tuple(grp) for _, grp in groupby(b, key=itemgetter(-1)))
>>> ((('-', '-', 'z'),), (('-', '-', 'x'),), (('-', '-', 'z'),))
如果您不希望发生这种情况,请先对 b
进行排序。
>>> last = itemgetter(-1)
>>> tuple(tuple(grp) for _, grp in groupby(sorted(b, key=last), key=last))
>>> ((('-', '-', 'x'),), (('-', '-', 'z'), ('-', '-', 'z')))
关于Python 元组操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53205572/