V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
doer233
V2EX  ›  Python

分割列表

  •  
  •   doer233 · 2016-12-13 08:09:23 +08:00 · 2871 次点击
    这是一个创建于 2901 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有这样一个列表,里面只有两种元素 0,1 。例如[0,1,0,0,0,1,1,1,0,0,1],要将这个列表分割得到以下列表[[0],[1],[0,0,0],[1,1,1],[0,0],[1]]。就是将列表里面连续的元素放入一个个子列表里。不知道能不能用 lambda 列表推导式求出?
    16 条回复    2016-12-13 17:43:01 +08:00
    wyntergreg
        1
    wyntergreg  
       2016-12-13 09:03:22 +08:00
    能。
    bazingaterry
        2
    bazingaterry  
       2016-12-13 09:16:55 +08:00 via iPhone
    reduce?
    Valyrian
        3
    Valyrian  
       2016-12-13 09:36:25 +08:00
    l = [0,1,0,0,0,1,1,1,0,0,1]
    l1 = [(l[i], i) for i in xrange(len(l)) if i == len(l) - 1 or l[i] != l[i+1]]
    l2 = [([l1[i][0]] * (l1[i][1] + 1 if i == 0 else l1[i][1] - l1[i-1][1])) for i in xrange(len(l1))]

    根本不值得这样写,可读性为 0 。。
    princelai
        4
    princelai  
       2016-12-13 10:39:23 +08:00
    l = [0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1]

    [[l[j]]*(i-j) for i,j in zip([i for i in range(len(l)) if l[i] != l[i-1]][1:] + [len(l)] , [i for i in range(len(l)) if l[i] != l[i-1]])]

    方法和楼上类似,不推荐这么做,写完我都晕了
    mgna17
        5
    mgna17  
       2016-12-13 10:51:07 +08:00   ❤️ 1
    l = [0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1]

    def func(x, y):
       try:
         if x[-1][-1] != y:
         x.append([y])
       else:
         x[-1].append(y)
       except IndexError:
         x.append([y])
       return x

    res = reduce(func, l, [])

    撸了个 reduce 版的😂
    mgna17
        6
    mgna17  
       2016-12-13 11:06:11 +08:00
    @mgna17

    缩进缩错了 - - ,改正

    l = [0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1]

    def func(x, y):
       try:
         if x[-1][-1] != y:
            x.append([y])
          else:
            x[-1].append(y)
       except IndexError:
         x.append([y])
       return x

    res = reduce(func, l, [])
    ericls
        7
    ericls  
       2016-12-13 11:10:47 +08:00
    @mgna17 你这个方法比上面的大概快 100%
    BBrother
        8
    BBrother  
       2016-12-13 13:38:41 +08:00
    @mgna17 怎么在回复里缩进的?
    mgna17
        9
    mgna17  
       2016-12-13 13:40:35 +08:00
    @BBrother

    我是复制到浏览器里手动打全角空格,所以我上面还打错了 😑
    9hills
        10
    9hills  
       2016-12-13 13:51:09 +08:00
    不要为了追求技巧。。就简简单单的 for 循环能搞定的事情。。。
    a=[0,1,0,0,0,1,1,1,0,0,1]
    b=[]
    for i in a:
    __if b and b[-1][0] == i:
    ____b[-1].append(i)
    __else:
    ____b.append([i])

    可读性秒杀楼上方法
    SakuraSa
        11
    SakuraSa  
       2016-12-13 13:59:50 +08:00   ❤️ 8
    似乎内置的 groupby 函数可以做这件事:

    from itertools import groupby
    a = [0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1]
    b = [list(it) for key, it in groupby(a)]
    Magic347
        12
    Magic347  
       2016-12-13 14:08:24 +08:00
    def gen(l):
    assert len(l) > 0
    curr = l[0]
    cnt = 1
    for i in range(1, len(l)):
    if l[i] == curr:
    cnt += 1
    else:
    yield [curr] * cnt
    curr = l[i]
    cnt = 1
    yield [curr] * cnt

    得到 1 个生成器可供迭代
    Magic347
        13
    Magic347  
       2016-12-13 14:09:51 +08:00
    def gen(l):
       assert len(l) > 0
       curr = l[0]
       cnt = 1
       for i in range(1, len(l)):
         if l[i] == curr:
           cnt += 1
         else:
           yield [curr] * cnt
           curr = l[i]
           cnt = 1
       yield [curr] * cnt

    得到 1 个生成器可供迭代
    petelin
        14
    petelin  
       2016-12-13 15:34:49 +08:00 via Android
    practicer
        15
    practicer  
       2016-12-13 16:55:28 +08:00
    @SakuraSa 最佳
    ppa22222
        16
    ppa22222  
       2016-12-13 17:43:01 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   922 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:40 · PVG 05:40 · LAX 13:40 · JFK 16:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.