【问题标题】:Find indexes of consecutive items in lists查找列表中连续项目的索引
【发布时间】:2020-07-20 08:38:16
【问题描述】:

我想要一个类似的列表:

x = [1,2,2,3,4,6,6]

并返回一个包含重复值索引的二维列表:

[ [1,2], [5,6]]

我尝试了以下方法:

new_list = []
i = 0
while i < len(x)-1:
    if x[i] == x[i+1]:
        new_list.append([x[i],x[i+1]]
    i += 1

x 不一定是排序的,但至少有一系列重复值。例如 x 也可以是:

x = [1,4,2,3,3,3,7,0]

【问题讨论】:

  • 初始列表排序了吗?
  • 您能否提供有关数组x的更多详细信息?
  • 如果 x = [1, 1, 1, 2, 2, 2],那么想要的输出是 [[0, 2], [3, 5]]?
  • 是的,这将是所需的输出
  • 如果重复值不按顺序排列怎么办,例如:x = [1 ,2 ,1 ,2] 这种情况下的答案是[[0,2], [1,3]]

标签: python python-3.x list indexing while-loop


【解决方案1】:

您可以跟踪当前索引,并且当下一个元素等于 current_index 中值的值时,将其附加到结果中,但是您需要增加索引的值,直到它的值不同

x = [1, 2, 2, 3, 4, 6, 6]

result = []
cur_idx = 0
i = 1

while i < len(x):
    if x[cur_idx] == x[i]:
        result.append([cur_idx, x[cur_idx]])

        # Increase value of i up to the index where there is different value
        while i < len(x):
            if x[cur_idx] != x[i]:
                # Set cur_idx to the index of different value
                cur_idx = i
                i += 1
                break
            i += 1
    else:
        cur_idx = i
        i += 1

print(result)
# [[1, 3], [5, 3]]

【讨论】:

    【解决方案2】:

    试试这个代码:

    # Hello World program in Python
    x = [1,2,2,3,4,6,6]
    new_list = []
    i = 0
    indexes = []
    while i < len(x)-1:
        if x[i] == x[i+1]:
            indexes.append(i)
            indexes.append(i+1)
        else:
            indexes = list(set(indexes))
            if len(indexes) != 0:
                new_list.append(indexes)
            indexes = []
        i+=1
    
    indexes = list(set(indexes))
    if len(indexes) != 0:
        new_list.append(indexes)
    print(new_list)
    

    结果:

    [[1, 2], [5, 6]]
    

    【讨论】:

      【解决方案3】:

      试试这个。

      def repeating_values( initital_list):
          cache = {}
          result = []
          for i, element in enumerate(initital_list):
              if element in cache:
                  result.append([cache[initital_list[i]], i])
              else:
                  cache[element] = i
      
          return result 
      
      

      供您参考

      
      x = [1,2,2,3,4,6,6]
      
      print(repeating_values(x))
      

      结果

      [[1, 2], [5, 6]]
      

      【讨论】:

        【解决方案4】:

        您可以在此处使用itertools.groupby。

        from itertools import groupby
        x=[1, 2, 2, 2, 3, 3, 4, 4, 6, 6, 6, 6, 6, 6, 8]
        ranges=[list(g) for _,g in groupby(range(len(x)),lambda idx:x[idx])]
        # [[0], [1, 2, 3], [4, 5], [6, 7], [8, 9, 10, 11, 12, 13], [14]]
        #   1    2  2  2    3  3    4  4    6  6  6   6   6   6     8
        
        final=[[r[0],r[-1]] for r in ranges if len(r)>1]
        # [[1, 3], [4, 5], [6, 7], [8, 13]]
        

        纯 Python 方法:

        x=[1, 2, 2, 2, 3, 3, 4, 4, 6, 6, 6, 6, 6, 6, 8]
        out=[]
        count=0
        for i in range(1,len(x)):
            prev=x[i-1]
            if x[i]==prev:
                count+=1
            elif count and x[i]!=prev:
                out.append([i-count-1,i-1])
                count=0
        if count:
            out.append([i-count,i])
        
        out
        # [[1, 3], [4, 5], [6, 7], [8, 13]]
        

        【讨论】:

          猜你喜欢
          • 2010-09-15
          • 2016-01-25
          • 2014-10-13
          • 1970-01-01
          • 2023-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-07
          相关资源
          最近更新 更多