【问题标题】:Divide the list in chunks (sub-lists) based on filter criterion根据过滤条件将列表划分为块(子列表)
【发布时间】:2017-03-09 08:12:15
【问题描述】:

我有一个这样的列表

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] 时,原始列表保持不变。所以循环迭代同一个项目。如何从原始列表中删除拼接的项目?所以我不必再次迭代它。

【问题讨论】:

  • 我没有看到你用来分割它们的代码,但你可能只想在拉出来后使用del splice[index:index]

标签: python list tuples splice


【解决方案1】:

这是一个不需要导入 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 秒
  • MosesKoledoye's answer 使用 itertools.groupby() 和 for 循环 需要 - 0.372 秒,
  • anonymous's answer 使用 itertools.groupby() 和列表理解 需要 - 0.321 秒

(不包括他们的代码导入itertools所花费的时间)

【讨论】:

  • 您对执行时间部分是正确的。这更快。由于在表达式中使用了lambdaitertools.groupsby() 方法较慢。
【解决方案2】:

List Comprehension 表达式使用itertools.groupby() 为:

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

【讨论】:

    【解决方案3】:

    您可以使用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')]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 2019-08-03
      相关资源
      最近更新 更多