我有一份数据列表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'] ]
答案 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。