根据过滤条件将列表划分为块(子列表)

ila*_*pad 2 python tuples list splice

我有这样的清单

a = ['31', '20', '54', '68', '65', '72', '00', '00', '00', '82', '4d', '61', '72', '67', '69', '6e', '00', '00', '00', '00','00', '84', '92', '4d','91']
Run Code Online (Sandbox Code Playgroud)

我想将它们分成元组列表并删除零块.

li_tup = [('31', '20', '54', '68', '65', '72'), ('82', '4d', '61', '72', '67', '69', '6e'), ('84', '92', '4d','91')] 
Run Code Online (Sandbox Code Playgroud)

当我使用splice[index:index]原始列表时保持不变.所以循环遍历同一个项目.如何从原始列表中删除拼接的项目?所以我不必再次迭代它.

Moi*_*dri 6

列表理解表达式使用itertools.groupby()as:

>>> from itertools import groupby
>>> a = ['31', '20', '54', '68', '65', '72', '00', '00', '00', '82', '4d', '61', '72', '67', '69', '6e', '00', '00', '00', '00','00', '84', '92', '4d','91']

>>> [tuple(group) for is_valid, group in groupby(a, lambda x: x!='00') if is_valid]
[('31', '20', '54', '68', '65', '72'), ('82', '4d', '61', '72', '67', '69', '6e'), ('84', '92', '4d', '91')]
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 6

这是一个不需要导入的列表理解答案itertools:

>>> a = ['31', '20', '54', '68', '65', '72', '00', '00', '00', '82', '4d', '61', '72', '67', '69', '6e', '00', '00', '00', '00','00', '84', '92', '4d','91']
>>> [ tuple(b.strip().split()) for b in ' '.join(a).split('00 ') if b ]
[('31', '20', '54', '68', '65', '72'), ('82', '4d', '61', '72', '67', '69', '6e'), ('84', '92', '4d', '91')]
Run Code Online (Sandbox Code Playgroud)

与其他方法(10,000次迭代)的比较:

  • 这种使用连接和分裂的方法需要0.214秒
  • MosesKoledoye使用itertools.groupby() for循环的答案需要 - 0.372s,
  • 使用itertools.groupby()列表理解的匿名答案需要 - 0.321s

(不包括导入代码所需的时间itertools)