我有多个类似以下的列表-
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])
我得到多行,但名称和年龄列却为空。还应考虑以上述方式传递列名,因为列名不是静态的。
答案 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')]