在Python 3中,我有一个元组:
a = ('aa', 'bb', 'cc', '|', 'dd', 'ee', 'ff')
我想将元组分成两个元组。元组必须在|
分割。 |
的索引不是静态的。
预期结果:
a = ('aa', 'bb', 'cc',)
b = ('dd', 'ee', 'ff',)
使用分频器将元组分成两部分的最有效方法是什么?
我知道元组是不可改变的,但情况要求我有点务实。
修改
在我的例子中,将有0或1个分隔符(|
)。
元组中的数据长度超过1。
答案 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
提供了一些开销,使得此解决方案比使用 元组切片大约<5>次更慢。不过,它仍然更加通用,更容易适用于未知数量的群体。index