How to merge the list in python
我已经读过这个,这个,还有这个,但是没有解决办法。
我有50个这样的列表:
1 | dataTest=[List1,List2,List3,...,List50] |
这些列表中的每一个都是图像列表和标签。我的意思是列表1的第一个维度是由一些图像组成的,而列表1的第二个维度是它们对应的标签。这样地:
1 | List1=[Images,Labels] |
例如,list1是一个包含700个带有标签0的图像的列表。列表2是一个包含1000个带标签1的图像的列表,…因此,我们有一个由50个列表组成的列表,其中每个列表的大小为2。
为了得到下面的矩阵,我想把所有的列表合并在一起。我的意思是这样的一个数组:
1 | dataTest=[Images of List1,2,3,...,50 , Labels of List1,2,3,...,50] |
所以,我们有一个两种尺寸的清单。第一个维度是所有列表中的所有图像,第二个维度是所有图像的标签。
如果我做对了,那么数据"list1=[图像,标签]"的结构是图像列表,标签是标签列表?如果是这样,下面的代码将合并它们并生成一个结果列表,其中包含所有图像的列表(或者更好的是一个元组,但当然可以转换)和所有标签的列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # generate sample data l1 = [['IMG_1', 'IMG_2', 'IMG_3', 'IMG_4'],['IMG_LABEL_1', 'IMG_LABEL_2', 'IMG_LABEL_3', 'IMG_LABEL_4']] l2 = [['IMG_11', 'IMG_12', 'IMG_13', 'IMG_14'],['IMG_LABEL_11', 'IMG_LABEL_12', 'IMG_LABEL_13', 'IMG_LABEL_14']] l3 = [['IMG_21', 'IMG_22', 'IMG_23', 'IMG_24'],['IMG_LABEL_21', 'IMG_LABEL_22', 'IMG_LABEL_23', 'IMG_LABEL_24']] data = [l1, l2, l3] merged_list = [] # merge the lists for source_list in data: merged_list += zip(source_list[0], source_list[1]) # change its structure result_list = zip(*merged_list) |
结果:
1 2 3 4 | [ ('IMG_1', 'IMG_2', 'IMG_3', 'IMG_4', 'IMG_11', 'IMG_12', 'IMG_13', 'IMG_14', 'IMG_21', 'IMG_22', 'IMG_23', 'IMG_24'), ('IMG_LABEL_1', 'IMG_LABEL_2', 'IMG_LABEL_3', 'IMG_LABEL_4', 'IMG_LABEL_11', 'IMG_LABEL_12', 'IMG_LABEL_13', 'IMG_LABEL_14', 'IMG_LABEL_21', 'IMG_LABEL_22', 'IMG_LABEL_23', 'IMG_LABEL_24') ] |
这就是你想要的:
1 2 3 | a=[[1,2],[2,3]] [v for d in a for v in d] [1, 2, 2, 3] |
操作编辑后更改:
1 2 3 4 5 6 | a=[[2,3],[2,3]] c=[] c.append([v[0] for v in a]) c.append([v[1] for v in a]) print c [[2, 2], [3, 3]] |
我已经创建了一个数据测试,希望与您的格式相同:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | List1 = [["img11","img12","img13"], ["label11","label12","label13","label14"]] List2 = [["img21","img22","img23"], ["label21","label22","label23","label24"]] List3 = [["img31","img32","img33"], ["label31","label32","label33","label34"]] dataTest = [List1, List2, List3] print"Input:", dataTest dataTest2 = [[],[]] for cur_list in dataTest: dataTest2[0].extend(cur_list[0]) dataTest2[1].extend(cur_list[1]) print"Output:", dataTest2 |
这将生成一个包含两个元素的列表,第一个元素包含所有图像,第二个元素包含所有标签:
1 2 3 | Input: [[['img11', 'img12', 'img13'], ['label11', 'label12', 'label13', 'label14']], [['img21', 'img22', 'img23'], ['label21', 'label22', 'label23', 'label24']], [['img31', 'img32', 'img33'], ['label31', 'label32', 'label33', 'label34']]] Output: [['img11', 'img12', 'img13', 'img21', 'img22', 'img23', 'img31', 'img32', 'img33'], ['label11', 'label12', 'label13', 'label14', 'label21', 'label22', 'label23', 'label24', 'label31', 'label32', 'label33', 'label34']] |
如果你想做的就是把一个列表变平,你只需要把这些列表放在一起。
1 | dataTest=sum(dataTest,[]) |
你只需要把列表按事物的外观展平,你可以用itertools来实现。
1 2 3 | from itertools import* dataTest=[['a',1],['a',2],['a',3]] print [k for k in chain.from_iterable(k[0] for k in dataTest)] |
产量
1 | ['a', 'a', 'a'] |