分割列表

2016-12-13 08:09:23 +08:00
 doer233
有这样一个列表,里面只有两种元素 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 列表推导式求出?
2903 次点击
所在节点    Python
16 条回复
wyntergreg
2016-12-13 09:03:22 +08:00
能。
bazingaterry
2016-12-13 09:16:55 +08:00
reduce?
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
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
2016-12-13 10:51:07 +08:00
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
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
2016-12-13 11:10:47 +08:00
@mgna17 你这个方法比上面的大概快 100%
BBrother
2016-12-13 13:38:41 +08:00
@mgna17 怎么在回复里缩进的?
mgna17
2016-12-13 13:40:35 +08:00
@BBrother

我是复制到浏览器里手动打全角空格,所以我上面还打错了 😑
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
2016-12-13 13:59:50 +08:00
似乎内置的 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
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
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
2016-12-13 15:34:49 +08:00
practicer
2016-12-13 16:55:28 +08:00
@SakuraSa 最佳
ppa22222
2016-12-13 17:43:01 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/327207

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX