【问题标题】:Interior grouping within a list列表内的内部分组
【发布时间】:2018-06-27 15:59:31
【问题描述】:
def gp(inp): #group positives in the list
  for x in range(len(inp)-1):
    if is_pos(inp[x][0]) and is_pos(inp[x+1][0]): 
      inp[x] += inp[x+1]
      del inp[x+1]

我在 python 中工作。上面的代码用于将相邻的积极因素组合在一起。由于我收到的错误,我认为这个问题会吸引其他人。那会是什么错误?一个索引错误。

Traceback (most recent call last):
  File "python", line 95, in <module>
  File "python", line 49, in formt
  File "python", line 10, in gp
IndexError: list index out of range

我想要实现的是对如下所示的列表进行分组:[[1],[2],[3],[-4],[-3],[-2],[-1],[0]] 看起来像这样:[[1,2,3],[-4,-3,-2,-1],[0]] 我没有其他导入,这不会调用任何其他函数。我将如何执行此操作,为什么会收到该错误?我的理论是它位于range(len(inp)),但我已经尝试过很多次尝试但没有运气。每个单独数字周围的括号是有意的,因此我可以通过“添加”它们将数字组合成列表。如果你有不同的方法,请告诉我。我希望这是关于一般的内部分组,所以试着概括一下我做错了什么。

【问题讨论】:

  • 这是一个机器学习库,将积极因素组合在一起是我过程中的重要一步。我希望我能解释原因,但那将是一个很长的评论。
  • 您正在删除一个列表元素,同时对其进行迭代。不要这样做。 See for instance here
  • 如果你有一个列表会发生什么[[1],[-1],[1]]你会喜欢它吗?
  • 0 是否假定为正数?
  • 标准的itertools 模块有一个groupby 函数,非常适合这样的任务。

标签: python python-3.x list


【解决方案1】:

下面是使用 itertools 的方法:

from itertools import groupby

def gp(inp):
    return [
        list(things)  # groupby yields iterators
        for _, things  # throw away the truth value
        # chain to remove the nesting
        in groupby(inp, lambda x: x<0)
    ]

用法:

>>> gp([1, 2, 3, -4, -3, -2, -1, 0])
[[1, 2, 3], [-4, -3, -2, -1], [0]]

如果你认为 0 是它自己的类,你可以通过将 lambda x: x&lt;0 替换为 lambda x: x*float("inf") 来避免一些hackiness:

>>> gp_new([1, 2, 3, -4, -3, -2, -1, 0, 1, 2, 3])
[[1, 2, 3], [-4, -3, -2, -1], [0], [1, 2, 3]]

【讨论】:

  • 您还应该展示与平面列表一起使用的更简单的版本。 OP 仅使用该列表列表来简化合并组的任务。
  • 您可以使用chain.from_iterable 来避免解包列表。
  • 我删除了更复杂的版本
  • 为什么这不将 0 与 positive 数字分组?两者都在lambda 支票上返回False..
  • @Ev.Kounis 负数小于 0,因此返回 True
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
相关资源
最近更新 更多