鱼C论坛

 找回密码
 立即注册
查看: 1385|回复: 4

[技术交流] Python 实现 split_at()

[复制链接]
发表于 2020-4-4 15:20:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zltzlt 于 2020-4-4 17:28 编辑

Python 实现 split_at()


上代码:
def split_at(pred, iterable):
    """split_at(pred, iterable) --> [generator object]"""
    if not callable(pred):
        val = pred

        def pred(x):
            return x == val
    b = []
    for i in iterable:
        if pred(i):
            yield b
            b = []
        else:
            b.append(i)
    yield b


print(list(split_at("b", "abcdbecba")))               # Out: [['a'], ['c', 'd'], ['e', 'c'], ['a']]
print(list(split_at(lambda x: x % 2, range(10))))     # Out: [[0], [2], [4], [6], [8], []]
print(list(split_at(5, [3, 5, 7, 8, 5, 2, 1, 4])))    # Out: [[3], [7, 8], [2, 1, 4]]

如果代码有问题,欢迎在评论区指正

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-4 17:15:34 | 显示全部楼层
我想从实用的角度提一个建议:
sorted(iterable, *, key=None, reverse=False)
就好比sorted()函数中的key值不一定是方程,也可以是none来表示按照从大到小的顺序排列;
如若实现这样的转变:
split_at(lambda x: x == "b", "abcdbecba")   ---> split_at( "b", "abcdbecba")    得到相同的结果 : [['a'], ['c', 'd'], ['e', 'c'], ['a']]
使用更方便。

感觉这个还是蛮实用的一个函数。

若提的不对,还望见谅!

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-4 17:28:03 | 显示全部楼层
sYMMetrY 发表于 2020-4-4 17:15
我想从实用的角度提一个建议:
就好比sorted()函数中的key值不一定是方程,也可以是none来表示按照从大 ...

建议被采纳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-4 17:39:58 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-8 14:31:12 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-4-14 14:45 编辑
_no_arg=object()

def split(iterable,/,*,func=_no_arg,value=_no_arg):
    '''
    split(iterable) -> generator
    split(iterable,*,func=obj) -> generator
    split(iterable,*,value=obj) -> generator

    With no keyword argument, return a generator split iterable by True items.
    With 'func' specified, return a generator split iterable by items which func(item) is True.
    With 'value' specified, return a generator split iterable by items which is equal to value.
    '''

    #init
    if func is _no_arg:
        if value is _no_arg:
            func=bool
        
        else:
            func=lambda x:x!=value

    elif value is not _no_arg:
        raise ValueError("Cannot specify 'func' and 'value' at the same time")
    
    #main
    temp=[]

    for i in iterable:
        if func(i):
            yield temp
            temp=[]
        else:
            temp.append(i)

    yield temp
我也写了一个

PS:提个建议:你的代码在一个装有 类/函数/callable 的迭代对象里会出错,建议改一改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 08:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表