将元组分成两部分的最有效方法是什么?

Vin*_*oft -6 python tuples

在Python 3中我有一个元组:

a = ('aa', 'bb', 'cc', '|', 'dd', 'ee', 'ff')
Run Code Online (Sandbox Code Playgroud)

我想把元组分成两个元组.元组必须分为|.索引|不是静态的.预期结果:

a = ('aa', 'bb', 'cc',)
b = ('dd', 'ee', 'ff',)
Run Code Online (Sandbox Code Playgroud)

使用分频器将元组分成两部分的最有效方法是什么?

我知道元组是不可改变的,但情况要求我有点务实.

编辑: 在我的情况下,将有0或1个分隔符(|).元组中的数据长度大于1.

khe*_*ood 6

你可以找到'|' 使用index,你可以使用切片切片元组.

a = ('a', 'b', 'c', '|', 'd', 'e', 'f')
i = a.index('|')
a,b = a[:i],a[i+1:]
Run Code Online (Sandbox Code Playgroud)

  • @cᴏʟᴅsᴘᴇᴇᴅOP特别希望将一个元组分成两个" (2认同)

tob*_*s_k 6

正如评论中所建议的那样,您可以使用itertools.groupby将元组细分为"非分隔符"和"分隔符"组,然后选择那些不是分隔符的组.这适用于任意数量的段,但如果您知道恰好有两个组,也可以将其解压缩为两个变量.

>>> a = ('a', 'b', 'c', '|', 'd', 'e', 'f', '|', 'g', 'h', 'i')
>>> [tuple(g) for k, g in itertools.groupby(a, key='|'.__eq__) if not k]
[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', 'i')]
Run Code Online (Sandbox Code Playgroud)

这也可以概括为允许使用例如不同的分隔符groupby(a, key='|-'.__contains__).


关于注释:它的时间复杂度应该是O(n),就像使用时一样index,如果你不知道在哪里拆分并且没有以任何方式排序元组,那么这也是你能想到的最好的.但请注意,这会groupby产生一些开销,使得此解决方案比使用元组切片 4-5倍index.不过,它仍然更加通用,更容易适用于未知数量的群体.

  • 关于这一点最好的部分是,它适用于0,1或100万个分隔符. (3认同)