代码之家  ›  专栏  ›  技术社区  ›  ReeceAPoole

如何根据Python 3中的键值对连续的元素值进行分组?

  •  -3
  • ReeceAPoole  · 技术社区  · 8 年前

    我是Python初学者,需要这方面的帮助。

    我的输入是

    input: [(5, 1), (0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (6, 3)]
    

    输入包含 [(value,key)]

    我的输出应该是

    0,1,2
    
    3,4,6
    
    5
    

    连续值需要根据键计数分组,然后排序以显示最终输出。

    ie)5出现一次,应单独分组

    0、1、2的键计数为3,因此应分组在一起

    3、4、6的键计数为3,因此应分组在一起

    最终输出应按顺序排序,如下所示

    0,1,2
    
    3,4,6
    
    5.
    

    我试过了 itertools.groupby() 它仅基于相似的键对值进行分组。

    任何解决方案都会有帮助。

    我尝试了以下方法:

    sortedValidGroups = sorted(validGroups,key = lambda x:x[1])
    
    print(sortedValidGroups)
    
    groups = [list(group) for key, group in groupby(sortedValidGroups, itemgetter(1))]
    
    print(groups)
    

    输出:

    [[(5, 1)], [(0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (6, 3)]]
    

    但我的输出应该是(这是 [(values,keys)] )

    [[(5, 1)],[(0, 3), (1, 3), (2, 3)],[(3, 3), (4, 3), (6, 3)]]
    

    然后我需要对值进行排序,以生成最终输出

    0,1,2
    
    3,4,6
    
    5.
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   shahaf    8 年前

    你的解决方案看起来不错,只是需要一个好的结局。。。 从最终输出中,要对阵列进行分区,可以执行以下操作

    a = [[(5, 1)], [(0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (6, 3)]]
    b = [[(0, 2), (1, 2), (2, 2), (3, 2)]]
    
    def regroup(lst):
      tmp = list()
      for i in range(len(lst)):
        step = lst[i][0][1]
        for j in range(0,len(lst[i]),step):
          tmp.append(lst[i][j:j+step])
    
      return sorted(tmp , key=lambda x : x[0][0])
    
    
    regroup(a)
    [[(0, 3), (1, 3), (2, 3)], [(3, 3), (4, 3), (6, 3)], [(5, 1)]]
    
    regroup(b)
    [[(0, 2), (1, 2)], [(2, 2), (3, 2)]]