Python 元组操作

标签 python django tuples

我在 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/

相关文章:

python - Django: href {% url %} 问题

c++ - 元组在哪里存储其数据?

python - 根据输入,在列表上使用 tuple() 不会返回相同的元组

python - 元组列表的唯一组合

python - 如何在屏幕上显示几秒钟的文字?

python - UnicodeEncodeError :'charmap' 与 'Ö' ,'Ç' 等

python - 解释这些中点算法之间的区别

javascript - 带有 React 前端的 Django 后端

python - Django DateTimeInput 类型 'datetime-local' 未保存到数据库

python - 在我的博客上 - 匹配的查询不存在