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

Divide the list in chunks (sub-lists) based on filter criterion

我有一个这样的列表

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']

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

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

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

您可以使用 itertools.groupby,因为我们事先没有 '00' 的项目索引:

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']

result = []
for i, g in groupby(a, lambda x: x!='00'):
    if i:
        result.append(tuple(g))
print(result)
# [('31', '20', '54', '68', '65', '72'), ('82', '4d', '61', '72', '67', '69', '6e'), ('84', '92', '4d', '91')]

List Comprehension expression using 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')]

这是一个不需要导入的列表理解答案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')]

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

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

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