【问题标题】:Python itertools groupby not grouping as I expectPython itertools groupby 没有按我的预期分组
【发布时间】:2013-01-28 09:59:00
【问题描述】:

假设我有一个这样的字符串:

st='''Line 1
Line 2
Line 3
Line 4

Line 5
Line 6

Line 7
Line 8 
Line 9

Line 10
Line 11
Line 12
Line 13
Line 14'''
# may be really big...

现在假设我想要一个按空行分组的英雄联盟:

[['Line 1', 'Line 2', 'Line 3', 'Line 4'],
 ['Line 5', 'Line 6'],
 ['Line 7', 'Line 8 ', 'Line 9'],
 ['Line 10', 'Line 11', 'Line 12', 'Line 13', 'Line 14']]

我知道我可以使用正则表达式拆分来创建该英雄联盟:

[[x] for x in re.split(r'^\s*\n',st,flags=re.MULTILINE)]

但是,我正在尝试使用非正则表达式 Python 生成器来创建它。我得到的最接近的是这个可怕的东西(包括空白,我知道根本没有效率......):

result=[]        
for sub in (group for key, group in itertools.groupby(st.splitlines(), lambda x: not x.rstrip())):
    result.append(list(sub))

print result

关于前进方向的任何提示?

我有点脱口而出THIS SO question

【问题讨论】:

  • 顺便说一下,你的最终循环可以简化为[list(group) for _, group in itertools.groupby(st.splitlines(), lambda x: not x.rstrip())]

标签: python list itertools


【解决方案1】:

我可能会写

>>> grouped = itertools.groupby(map(str.strip, st.splitlines()), bool)
>>> [list(g) for k,g in grouped if k]
[['Line 1', 'Line 2', 'Line 3', 'Line 4'], ['Line 5', 'Line 6'], 
['Line 7', 'Line 8', 'Line 9'], ['Line 10', 'Line 11', 'Line 12', 'Line 13', 'Line 14']]

这也将处理带有空格的空白行,而基于\n\n 的拆分不会。另一方面,它不保留前导和尾随空格,这来自您可能想要的'Line 8 ' 示例。如果这很重要,您可以这样做:

grouped = itertools.groupby(st.splitlines(), lambda x: bool(x.strip()))

(看起来与您已经在做的非常接近。)

【讨论】:

  • 达克! (拍头)这是我错过的第二个([list(g) for k,g in grouped if k])理解!谢谢!
【解决方案2】:

是否有某些原因这对您不起作用?

>>> lol = [group.split("\n") for group in st.split("\n\n")]
>>> pprint(lol)
[['Line 1', 'Line 2', 'Line 3', 'Line 4'],
 ['Line 5', 'Line 6'],
 ['Line 7', 'Line 8 ', 'Line 9'],
 ['Line 10', 'Line 11', 'Line 12', 'Line 13', 'Line 14']]

【讨论】:

  • 这很棒(+1),但我希望的是一个通用的目的生成器。查看问题的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多