如何在python中合并列表

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
print

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