如何获取python列表中不同整数组的最大索引

如何获取python列表中不同整数组的最大索引,python,Python,例如: [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0] 在这种情况下,我需要: 第一个'0'组=索引:0-4,长度:5 第一个'1'组=索引:5-6,长度:2 第二个'0'组=索引:7,长度:1 2nd'1'group=index:8-17,length:10我想您正在寻找itertools.groupby。有了它,您可以通过原始数据集中的每个整数分组获得列表列表 >>> data =

例如:

[0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
在这种情况下,我需要:

  • 第一个
    '0'
    组=索引:0-4,长度:5
  • 第一个
    '1'
    组=索引:5-6,长度:2
  • 第二个
    '0'
    组=索引:7,长度:1

  • 2nd
    '1'
    group=index:8-17,length:10
    我想您正在寻找
    itertools.groupby
    。有了它,您可以通过原始数据集中的每个整数分组获得列表列表

    >>> data = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
    >>> [list(group) for _, group in itertools.groupby(data)]
    [[0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0,0, 0]]
    
    或者,要获取索引,也可以使用
    itertools.groupby和.islice
    操作符.itemgetter

    >>> [sorted(set(itemgetter(0, -1)([i[0] for i in g))) for _, g in groupby(enumerate(data), key=itemgetter(1))]
    [[0, 4], [5, 6], [7], [8, 17], [18, 22]]
    
    或者,要获取开始或结束索引,请使用以下命令:(注意
    min
    max
    确定开始或结束索引)

    要获得最大组使用的起始索引:

    >>> max(([next(group)[0], sum(1 for _ in group)] for _, group in groupby(enumerate(data), key=itemgetter(1))), key=itemgetter(1))[0]
    8
    

    我想您正在寻找
    itertools.groupby
    。有了它,您可以通过原始数据集中的每个整数分组获得列表列表

    >>> data = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
    >>> [list(group) for _, group in itertools.groupby(data)]
    [[0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0,0, 0]]
    
    或者,要获取索引,也可以使用
    itertools.groupby和.islice
    操作符.itemgetter

    >>> [sorted(set(itemgetter(0, -1)([i[0] for i in g))) for _, g in groupby(enumerate(data), key=itemgetter(1))]
    [[0, 4], [5, 6], [7], [8, 17], [18, 22]]
    
    或者,要获取开始或结束索引,请使用以下命令:(注意
    min
    max
    确定开始或结束索引)

    要获得最大组使用的起始索引:

    >>> max(([next(group)[0], sum(1 for _ in group)] for _, group in groupby(enumerate(data), key=itemgetter(1))), key=itemgetter(1))[0]
    8
    

    标准库为此提供了
    itertools.groupby
    。使用起来有点棘手,因为它需要做很多工作:

    >>> from itertools import groupby
    >>> data = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
    >>> groupby(data)
    <itertools.groupby object at 0x0000015AB6EB3C78>
    
    现在我们可以看到发生了什么:grouper对象从列表中生成块

    所以我们需要做的就是检查这些列表的
    len
    ,并获得最大值。我们修正理解,以便忽略
    ,获得每个
    石斑鱼
    len
    ,并将结果输入内置的
    max
    ,而不是制作列表:

    >>> max(len(list(grouper)) for value, grouper in groupby(data))
    10
    

    标准库为此提供了
    itertools.groupby
    。使用起来有点棘手,因为它需要做很多工作:

    >>> from itertools import groupby
    >>> data = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
    >>> groupby(data)
    <itertools.groupby object at 0x0000015AB6EB3C78>
    
    现在我们可以看到发生了什么:grouper对象从列表中生成块

    所以我们需要做的就是检查这些列表的
    len
    ,并获得最大值。我们修正理解,以便忽略
    ,获得每个
    石斑鱼
    len
    ,并将结果输入内置的
    max
    ,而不是制作列表:

    >>> max(len(list(grouper)) for value, grouper in groupby(data))
    10
    

    不使用itertools,您可以用另一种方式完成:

    j=0
    for i,val in enumerate(data):
        if i == 0:
            out=[[val]]
        if val == data[i-1]:
            out[j] += [val]
        else:
            j+=1
            out += [[val]]
    
    输出:

    [[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
    
    {0: [6, 1, 5], 1: [2, 10]}
    
    10
    
    10 8 17
    
    现在,使用唯一值和每个值的子列表长度制作一个dict:

    counts = {}
    for o in out:
        if o[0] not in counts.keys():
            counts[o[0]] = [len(o)]
        else:
            counts[o[0]] += [len(o)]
    
    输出:

    [[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
    
    {0: [6, 1, 5], 1: [2, 10]}
    
    10
    
    10 8 17
    
    现在,使用您所追求的值获取序列的最大长度,在您的情况下,它是1:

    max(counts[1])
    
    输出:

    [[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
    
    {0: [6, 1, 5], 1: [2, 10]}
    
    10
    
    10 8 17
    
    编辑:要获取此特定序列的索引,您可以执行以下操作:

    id0 = 0
    for o in out:
        if o[0] != 1 or len(o) != max(counts[1]):
            id0 += len(o)
        if o[0] == 1 and len(o) == max(counts[1]):
            id0 -= 1
            break
    
    id1 = id0 + max(counts[1]) - 1
    print(max(counts[1]), id0, id1)
    
    输出:

    [[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
    
    {0: [6, 1, 5], 1: [2, 10]}
    
    10
    
    10 8 17
    

    它不是最漂亮的……但它很有效:)

    不用itertools,你可以用另一种方式:

    j=0
    for i,val in enumerate(data):
        if i == 0:
            out=[[val]]
        if val == data[i-1]:
            out[j] += [val]
        else:
            j+=1
            out += [[val]]
    
    输出:

    [[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
    
    {0: [6, 1, 5], 1: [2, 10]}
    
    10
    
    10 8 17
    
    现在,使用唯一值和每个值的子列表长度制作一个dict:

    counts = {}
    for o in out:
        if o[0] not in counts.keys():
            counts[o[0]] = [len(o)]
        else:
            counts[o[0]] += [len(o)]
    
    输出:

    [[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
    
    {0: [6, 1, 5], 1: [2, 10]}
    
    10
    
    10 8 17
    
    现在,使用您所追求的值获取序列的最大长度,在您的情况下,它是1:

    max(counts[1])
    
    输出:

    [[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
    
    {0: [6, 1, 5], 1: [2, 10]}
    
    10
    
    10 8 17
    
    编辑:要获取此特定序列的索引,您可以执行以下操作:

    id0 = 0
    for o in out:
        if o[0] != 1 or len(o) != max(counts[1]):
            id0 += len(o)
        if o[0] == 1 and len(o) == max(counts[1]):
            id0 -= 1
            break
    
    id1 = id0 + max(counts[1]) - 1
    print(max(counts[1]), id0, id1)
    
    输出:

    [[0, 0, 0, 0, 0, 0], [1, 1], [0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0]]
    
    {0: [6, 1, 5], 1: [2, 10]}
    
    10
    
    10 8 17
    

    它不是最漂亮的…但它可以工作:)

    您可以使用以下函数进行迭代:

    def count_through_a_list(x):
      """
      returns all distinct continuous groups of values in a list
      output is in the form of records
      """
    
      # Initialize these values
      group_start = 0
      group_count = 1
      prev = x[0]
      groups = []
    
      for i,n in enumerate(x):
    
        # if n is not the same as the previous value OR i is the last index
        if n!=prev or i == len(x)-1:
          groups.append({'start':group_start, 'end':i-1, 'value':prev, 'length':i-group_start, 'group_counter':group_count})
          # Reset the appropriate values
          group_count+=1
          group_start = i
          prev = n
    
      return groups
    
    groups = count_through_a_list(x)
    
    pd.DataFrame(groups, columns=['start','end','value', 'length', 'group_counter'])
    
        start   end value   length  group_counter
    0   0   4   0   5   1
    1   5   6   1   2   2
    2   7   7   0   1   3
    3   8   17  1   10  4
    4   18  21  0   4   5
    
    

    可以使用以下函数进行迭代:

    def count_through_a_list(x):
      """
      returns all distinct continuous groups of values in a list
      output is in the form of records
      """
    
      # Initialize these values
      group_start = 0
      group_count = 1
      prev = x[0]
      groups = []
    
      for i,n in enumerate(x):
    
        # if n is not the same as the previous value OR i is the last index
        if n!=prev or i == len(x)-1:
          groups.append({'start':group_start, 'end':i-1, 'value':prev, 'length':i-group_start, 'group_counter':group_count})
          # Reset the appropriate values
          group_count+=1
          group_start = i
          prev = n
    
      return groups
    
    groups = count_through_a_list(x)
    
    pd.DataFrame(groups, columns=['start','end','value', 'length', 'group_counter'])
    
        start   end value   length  group_counter
    0   0   4   0   5   1
    1   5   6   1   2   2
    2   7   7   0   1   3
    3   8   17  1   10  4
    4   18  21  0   4   5
    
    

    到目前为止你试过什么?一般来说,在StackOverflow上,您应该发布您当前拥有的代码以及出现的问题。这里的长度是多少?第4组的长度是10,但你说它应该是最大值1。@Jab我认为“最大值1”应该是指“连续1个值序列的最大长度”。@Jab和Karl:是的,我是指序列“1”的最大长度。到目前为止,你试过什么?一般来说,在StackOverflow上,您应该发布您当前拥有的代码以及出现的问题。这里的长度是多少?第4组的长度是10,但你说它应该是最大值1。@Jab我认为“最大值1”应该是指“连续1个值序列的最大长度”。@Jab和Karl:是的,我是指序列的最大长度'1',谢谢@Karl!所以我得到了序列的最大长度值(0和1)。但我也需要索引。在这种情况下是8-17。在这种情况下,您可能需要手动执行。想一想你将如何用纸和铅笔来解决它,一次看一个元素。在这个过程中,你需要记住什么信息?嗯,(a)每当我遇到1时,我可以迭代列表(b),我开始计数和开始索引(c)当不再有1时,记录结束索引(d)重复并检查计数值是否增加(e)对应计数的开始和结束的最大值给了我索引。但这当然是没有效率的!工作很辛苦,但效率很好。每个元素只需要看一次,对吗?很明显,你做不到比这更好的了。itertools解决方案也必须以更隐蔽的方式查看每个元素。谢谢@Karl!所以我得到了序列的最大长度值(0和1)。但我也需要索引。在这种情况下是8-17。在这种情况下,您可能需要手动执行。想一想你将如何用纸和铅笔来解决它,一次看一个元素。在这个过程中,你需要记住什么信息?嗯,(a)每当我遇到1时,我可以迭代列表(b),我开始计数和开始索引(c)当不再有1时,记录结束索引(d)重复并检查计数值是否增加(e)对应计数的开始和结束的最大值给了我索引。但这当然是没有效率的!工作很辛苦,但效率很好。每个元素只需要看一次,对吗?很明显,你做不到比这更好的了。itertools解决方案也必须以更隐蔽的方式查看每个元素