首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得python列表中不同整数组的最大索引

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

Stack Overflow用户
提问于 2019-10-23 00:08:31
回答 4查看 386关注 0票数 1

示例:

代码语言:javascript
复制
[0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]

在这种情况下,我需要:

1

  • 2nd '1'
  1. 1 '0'组=索引: 0-4,长度:5
  2. 1 '1'组=指数5-6,长度:2
  3. 第二组=索引:7,长度:
  4. E 117'0'>组=索引: 8-17,长度:10<代码>E 218<-需要这个<代码>D19sH 220<代码>H 121第3组>d22组=索引: 18 - 22,长度:5<代码>H 223<代码G 224>
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-23 00:56:53

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

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-10-23 00:24:16

我想你是在找itertools.groupby。这样,您就可以通过原始数据集中的每一组整数获得列表列表。

代码语言:javascript
复制
>>> 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 and .isliceoperator.itemgetter在一行中执行此操作。

代码语言:javascript
复制
>>> [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]]

或获取起始或结束索引,请使用以下命令:(注意,minmax确定开始或结束索引)

代码语言:javascript
复制
>>> [min(i[0] for i in group) for _, group in groupby(data)]
[0, 5, 7, 8, 18]
>>> [max(i[0] for i in group) for _, group in groupby(data)]
[4, 6, 7, 17, 22]

并获得最大组的起始指数:

代码语言:javascript
复制
>>> max(([next(group)[0], sum(1 for _ in group)] for _, group in groupby(enumerate(data), key=itemgetter(1))), key=itemgetter(1))[0]
8
票数 3
EN

Stack Overflow用户

发布于 2019-10-23 00:34:46

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

代码语言:javascript
复制
>>> 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>

嗯。这似乎还不太有用。但是我们查看文档并看到它是一个生成器,所以让我们尝试将它扩展为一个列表:

代码语言:javascript
复制
>>> list(groupby(data))
[(0, <itertools._grouper object at 0x0000015AB6EC2BA8>), (1, <itertools._grouper
 object at 0x0000015AB6ED82B0>), (0, <itertools._grouper object at 0x0000015AB6E
D8518>), (1, <itertools._grouper object at 0x0000015AB6EFE780>), (0, <itertools.
_grouper object at 0x0000015AB6F028D0>)]

这里的0和1值对应于原始data中的0和1s,但我们仍然有这些其他对象。这些也是发电机:

代码语言:javascript
复制
>>> [(value, list(grouper)) for value, grouper in groupby(data)]
[(0, [0, 0, 0, 0, 0]), (1, [1, 1]), (0, [0]), (1, [1, 1, 1, 1, 1, 1, 1, 1, 1,
1]), (0, [0, 0, 0, 0, 0])]

现在我们可以看到发生了什么:石斑鱼对象从列表中生成块。

因此,我们所需要做的就是检查这些列表的len并获得最大值。我们修复理解,从而忽略value,获取每个grouperlen,并将结果传递给内置max,而不是列出列表:

代码语言:javascript
复制
>>> max(len(list(grouper)) for value, grouper in groupby(data))
10
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58513783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档