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

时间:2018-03-24 07:59:42

标签: python python-3.x grouping

我是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 个答案:

答案 0 :(得分:0)

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

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)]]