Просматривая модуль itertools, я не вижу ничего, что можно было бы использовать в качестве общей, итерационной версии str.split
. Есть ли простой, идиоматический способ сделать это?Аналог str.split для итераций?
Эти модульные тесты должны продемонстрировать, что я имею в виду:
class SplitAnalog(unittest.TestCase):
def test_splitEmpty(self):
"""
>>> ''.split()
[]
"""
actual = split(None, [])
self.assertEqual(tuple(actual),())
def test_singleLine(self):
"""
>>> '123\n'.split()
['123']
"""
actual = split(lambda n: n is None, [1, 2, 3, None])
self.assertEqual(tuple(tuple(line) for line in actual), ((1, 2, 3),))
def test_allNones(self):
"""
>>> '\n\n\n'.split()
[]
"""
actual = split(lambda n: n is None, [None] * 3)
self.assertEqual(tuple(actual),())
def test_splitNumsOnNone(self):
"""
>>> '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]
actual = split(lambda n: n is None, nums)
self.assertEqual(tuple(tuple(line) for line in actual), (
(3, 1, 4, 1, 5, 9),
(2, 6, 5, 3, 5),
(8, 9, 7, 9, 3)))
def test_splitNumsOnNine(self):
nums = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9, 8, 7, 3]
actual = split(lambda n: n == 9, nums)
self.assertEqual(tuple(tuple(line) for line in actual), (
(3, 1, 4, 1, 5,),
(2, 6, 5, 3, 5),
(8, 7, 3)))
Что бы такая функция называться? Я не могу найти пример, даже когда я ткнул в other language libraries.
Мне нравится! Он проходит тесты. –
@MichaelKropat: ваше редактирование моего кода сломало все примеры. – DSM
oops :(Я могу исправить это –