将两个相关列表组织成块

时间:2013-11-16 17:27:41

标签: python list

我有一份数据列表data = [ x1, x2, ..., xn ]以及此数据的相应标签labels = [l1, l2, ..., ln]。我想组织这两个相关的列表,以便将其拆分为相同大小的块,例如sizeChunk = 3我们有data = [ [x1, x2, x3], ..., [xi, xj, xn] ]; labels = [ [l1, l2, l3], ..., [li, lj, ln] ]。使用以下功能很容易:

def chunks(data, labels, sizeChunk):
   chunks_data = [data[i:i+n] for i in range(0, len(data), sizeChunk)]
   chunks_labels = [labels[i:i+n] for i in range(0, len(labels), sizeChunk)]
   return chunks_data, chunks_labels

但是,我想要的更复杂。假设我们只有标签可以采用的4个可能值:'A'或'B'或'C'或'D',即setPossibleLabels = ['A', 'B', 'C', 'D']。我希望第一个块只包含标有'A'的数据,第二个块只包含标有'A'和/或'B'的数据,第三个块将包含标有'A'和/或'B的数据'和/或'C',......等等。

换句话说,对于这个例子,类型'A'的数据可以出现在任何块中,类型'B'的数据可以出现在除第一个之外的任何块中,类型'C'的数据可以出现在除第一个和第二个块之外的任何块中,“D”类型的数据可以出现在除第一个,第二个和第三个块之外的任何块中。

是否可以在Python中轻松完成?

编辑:示例:

输入:

data = [ x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11 ]
labels = [ 'A', 'B', 'B', 'B', 'A', 'B', 'C', 'A', 'C', 'C', 'A' ]
setPossibleLabels = [ 'A', 'B', 'C' ] # same as list(set(labels))
chunk_size = 3

预期输出例如:

chunks_data = [ [x1, x5, x8], [x2, x11, x3], [x7, x9, x4], [x6, x10, x11 ] ]
chunks_labels = [ ['A','A','A'], ['B','A','B'], ['C', 'C', 'B'], ['B', 'C', 'A'] ]

1 个答案:

答案 0 :(得分:1)

非常难看,但它应该有用。

from itertools import chain, repeat    
data = range(0,12)
labels = [ 'A', 'B', 'B', 'C', 'A', 'B', 'C', 'A', 'C', 'A', 'C' ]
setPossibleLabels = [ 'A', 'AB', 'ABC' ]
chunk_size = 3
chunks_data = []
chunks_labels = []

for label in chain(setPossibleLabels, repeat(setPossibleLabels[-1])):
    chunks_data.append([])
    chunks_labels.append([])
    for index in range(chunk_size):
        i = 0
        try:
            while labels[i] not in label:
                i += 1
        except IndexError:
            break
        chunks_data[-1].append(data.pop(i))
        chunks_labels[-1].append(labels.pop(i))
    if len(data) == 0:
        break

print chunks_data
print chunks_labels

哪个收益率:

[[1, 5, 8], [2, 3, 6], [4, 7, 9], [10, 11]]
[['A', 'A', 'A'], ['B', 'B', 'B'], ['C', 'C', 'C'], ['A', 'C']]

这是预期的输出吗?从len(data) == 11开始,最后一个块的长度为2。