如何为每个列表逐项合并n个列表

时间:2017-07-31 11:18:44

标签: python python-2.7

我想制作一个大型列表,用于输入包含4个不同列表值的数据库。我希望它像

[[list1[0], list2[0], list3[0], list4[0]], [list1[1], list2[1], list3[1], list4[1]], etc.....]

另一个问题是目前收到的数据如下:

[ [ [list1[0], list1[1], [list1[3]]], [[list2[0]]], etc.....]

我尝试使用索引循环遍历每个列表,并根据这些列表将它们添加到新列表中但它没有工作,我很确定它不起作用,因为一些这些列表的长度不同(它们不是故意的,而是它的自动数据,所以有时会出现错误)。

任何人都知道最好的方法是什么?感谢。

5 个答案:

答案 0 :(得分:1)

可以使用zip函数构建第一个列表,如下所示(对于4个列表):

list1 = [1,2,3,4]
list2 = [5,6,7,8]
list3 = [9,10,11,12]
list4 = [13,14,15,16]

res = list(zip(list1,list2,list3,list4))

对于存储在另一个列表中的仲裁数量的列表,您可以使用* -notation来解压缩外部列表:

lists = [...]

res = list(zip(*lists))

要在第二期中构建从您的数据压缩的列表列表,请使用flatten概念,然后压缩:

def flatten(l):
    res = []
    for el in l:
        if(isinstance(el, list)):
            res += flatten(el)
        else:
            res.append(el)

    return res

auto_data = [...]

res = list(zip(*[flatten(el) for el in auto_data]))

最后的一些澄清:

zip函数构造所有输入之间最小长度的结果,然后你需要将最后一个代码字符串中的列表理解中的数据扩展为一个长度,以免丢失一些信息。

答案 1 :(得分:0)

如果展平概念不起作用,请尝试一下:

import numpy as np

myArray = np.array([[list1[0], list2[0], list3[0], list4[0]], [list1[1], list2[1], list3[1], list4[1]]])
np.hstack(myArray)

另外一个应该有效:

np.concatenate(myArray, axis=1)

仅适用于那些在列表长度相同时搜索此问题的解决方案的人:

def flatten(lists):
    results = []
    for numbers in lists:
        for output in numbers:
            results.append(output)
            return results

print(flatten(n))

答案 2 :(得分:0)

所以,如果我理解正确,这是你的意见:

l = [[1.1,1.2,1.3,1.4],[2.1,2.2,2.3,2.4],[3.1,3.2,3.3,3.4],[4.1,4.2,4.3,4.4]]

并且您希望获得此输出

[[1.1,2.1,3.1,4.1],...]

如果是这样,可以使用zip

来完成
zip(*l)

答案 3 :(得分:0)

创建一个只给你计数器变量的for循环。使用该变量索引列表。制作一个临时列表,用其他列表中的值填充。将该列表添加到最后一个列表中。有了这个,您将获得所需的结构。

public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { HelloWorldConfiguration.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

如果所有4个列表的长度相同,则可以使用此代码使其更好。

nestedlist = []
for counter in range(0,x):
    temporarylist = []
    temporarylist.append(firstlist[counter])
    temporarylist.append(secondlist[counter])
    temporarylist.append(thirdlist[counter])
    temporarylist.append(fourthlist[counter])
    nestedlist.append(temporarylist)

答案 4 :(得分:0)

zip

的帮助下,这种理解应该有效
mylist = [i for i in zip(list1, list2, list3, list4)]

但是这假设所有列表都具有相同的长度。如果情况并非如此(或者你不确定),你可以&#34;填充&#34;他们首先是长度相同的。

def padlist(some_list, desired_length, pad_with):
    while len(some_list) < desired_length:
        some_list.append(pad_with)
    return some_list

list_of_lists = [list1, list2, list3, list4]
maxlength = len(max(list_of_lists, key=len))
list_of_lists = [padlist(l, maxlength, 0) for l in list_of_lists]

现在做上面的理解陈述,在我的测试中效果很好

mylist = [i for i in zip(*list_of_lists)]