如何将不相等的列表作为其他列表的首位压缩?

时间:2018-07-02 09:38:26

标签: python list iteration

我有多个类似以下的列表-

list1=['Tom']
list2=[16]
list3=['Maths','Science','English']
list4=['A','B','C']

我想压缩这些列表以实现以下映射-

所需结果-

[('Tom', 16, 'Maths','A'), ('Tom', 16, 'Science','B'), ('Tom', 16, 'English','C')]

我通过使用以下命令得到的结果-

results=zip(list1,list2,list3,list4)
[('Tom', 16, 'Maths','A')]

这只是我的问题的一个示例。如果提供通用的解决方案将很有帮助。 如果我使用语句-

res= itertools.izip_longest(*[x[c] for c in cols])

我得到多行,但名称和年龄列却为空。还应考虑以上述方式传递列名,因为列名不是静态的。

2 个答案:

答案 0 :(得分:1)

我在这里假设list4是列表中元素最多的列表。

list1 = ['Tom']
list2 = [16]
list3 = ['Maths', 'Science', 'English']
list4 = ['A', 'B', 'C']
longest = (list4 if (len(list4) > len(list3)) else list3)
shortest = (list3 if (longest == list4) else list4)

for list_ in (list1, list2, shortest):
    while len(list_) < len(longest):
        list_.append(list_[-1])

zip_list = zip(list1, list2, shortest, longest)

答案 1 :(得分:1)

您不想在这里查看zip 4个列表,因为您已经确认,前2个列表只包含一个项目。

相反,请使用列表理解功能,而仅使用zip列出最后2个列表:

name, age = list1[0], list2[0]
res = [(name, age, subject, grade) for subject, grade in zip(list3, list4)]

print(res)

[('Tom', 16, 'Maths', 'A'),
 ('Tom', 16, 'Science', 'B'),
 ('Tom', 16, 'English', 'C')]