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

时间:2017-12-18 12:25:51

标签: python tuples

在Python 3中,我有一个元组:

a = ('aa', 'bb', 'cc', '|', 'dd', 'ee', 'ff')

我想将元组分成两个元组。元组必须在|分割。 |的索引不是静态的。 预期结果:

a = ('aa', 'bb', 'cc',)
b = ('dd', 'ee', 'ff',)

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

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

修改 在我的例子中,将有0或1个分隔符(|)。 元组中的数据长度超过1。

2 个答案:

答案 0 :(得分:6)

你可以找到' |'使用index,您可以使用切片对元组进行切片。

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

答案 1 :(得分: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')]

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

关于注释:它的时间复杂度应该是O(n),就像使用index一样,如果你不知道在哪里拆分而且元组不是,那么这也是你能想到的最好的以任何方式订购。但是请注意,groupby提供了一些开销,使得此解决方案比使用 index 元组切片大约<5>次更慢。不过,它仍然更加通用,更容易适用于未知数量的群体。