Python iterables str.split的类似物?

Python iterables str.split的类似物?,python,split,itertools,iterable,Python,Split,Itertools,Iterable,通过查看模块,我没有看到任何可用作str.split的通用、可移植版本的内容。有没有一种简单的、惯用的方法 这些单元测试应该说明我的意思: 类拆分模拟(unittest.TestCase): def测试_splitEmpty(自): """ >>>''.split() [] """ 实际=拆分(无,[]) self.assertEqual(元组(实际),()) def测试_单线(自): """ >>>“123\n”.split() ['123'] """ 实际=拆分(λn:n为无,[1,2,3,

通过查看模块,我没有看到任何可用作
str.split
的通用、可移植版本的内容。有没有一种简单的、惯用的方法

这些单元测试应该说明我的意思:

类拆分模拟(unittest.TestCase):
def测试_splitEmpty(自):
"""
>>>''.split()
[]
"""
实际=拆分(无,[])
self.assertEqual(元组(实际),())
def测试_单线(自):
"""
>>>“123\n”.split()
['123']
"""
实际=拆分(λn:n为无,[1,2,3,None])
self.assertEqual(tuple(实际行的tuple(line))((1,2,3),)
def测试所有设备(自身):
"""
>>>'\n\n\n'.split()
[]
"""
实际=拆分(λn:n为无,[None]*3)
self.assertEqual(元组(实际),())
def测试_splitNumsOnNone(自身):
"""
>>>'314159\n26535\n89793'.split()
['314159', '26535', '89793']
"""
nums=[3,1,4,1,5,9,None,2,6,5,3,5,None,8,9,7,9,3]
实际=分割(λn:n为无,单位为毫秒)
self.assertEqual(tuple(实际行的tuple(line))(
(3, 1, 4, 1, 5, 9),
(2, 6, 5, 3, 5),
(8, 9, 7, 9, 3)))
def测试_splitNumsOnNine(自):
nums=[3,1,4,1,5,9,2,6,5,3,5,9,8,7,3]
实际值=拆分(λn:n==9,nums)
self.assertEqual(tuple(实际行的tuple(line))(
(3, 1, 4, 1, 5, ),
(2, 6, 5, 3, 5),
(8, 7, 3)))


这样的函数将被调用什么?我甚至在浏览时也找不到示例。

这里是一个示例实现:

def拆分(谓词,iterable):
iterable=iter(iterable)
行=[]
尝试:
尽管如此:
val=下一个(iterable)
如果谓词(val):
如果行:
生产线
行=[]
其他:
行。追加(val)
除停止迭代外:
如果行:
生产线

我想知道我是否忽略了一种更简单、更容易、更惯用的方式。有人吗?

假设我明白你的意思,也许吧

def pseudosplit(predicate, seq):
    return (tuple(g) for k,g in groupby(seq, key=lambda x: not predicate(x)) if k)
产生

>>> list(pseudosplit(lambda x: x is None, ()))
[]
>>> list(pseudosplit(lambda x: x is None, [1,2,3]))
[(1, 2, 3)]
>>> list(pseudosplit(lambda x: x is None, [None]*3))
[]
>>> list(pseudosplit(lambda x: x is None, [3, 1, 4, 1, 5, 9, None, 2, 6, 5, 3, 5, None, 8, 9, 7, 9, 3, None]))
[(3, 1, 4, 1, 5, 9), (2, 6, 5, 3, 5), (8, 9, 7, 9, 3)]

无论如何,它似乎像您的测试用例一样被拆分。

这将基于谓词进行拆分

def split(predicate, iterable):
    groups = (tuple(g) for k, g in groupby(iterable, predicate))
    return (g for g in groups if not all(imap(predicate, g)))
通过所有测试,包括一个测试,但没有通过

def test_splitNumsOnNine(self):
    """
    >>> '314159265359873\n'.split()
    ['31415', '26535', '873']
    """
    nums = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9, 8, 7, 3]
    actual = split(lambda n: n is 9, nums)
    self.assertEqual(tuple(tuple(line) for line in actual), (
        (3, 1, 4, 1, 5, ),
        (2, 6, 5, 3, 5),
        (8, 7, 3)))

我喜欢!它通过了测试。海报并看到DSM的答案更好。