首页 > 解决方案 > 嵌套的元组列表和分数列表

问题描述

我有问题,我会尽力解释。我有两个列表,每个列表包含 3 个项目。list1 中的每个项目在 list2 中都有一个分数。

List1= [[(3,4,5)], [(23,44), (23,5,3), (1,2)], [(23,5), (1,6)]]
List2= [2,4,1]

正如您在 list1 中看到的,项目 2 和 3 有多个对应于它们的分数的元组,我想将它们分成它们的分数:

what I want:
List1= [(3,4,5), (23,44), (23,5,3), (1,2), (23,5), (1,6)]
List2= [2,4,4,4,1,1]

or 

List1= [[(3,4,5)], [(23,44)], [(23,5,3)], [(1,2)], [(23,5)], [(1,6)]]
List2= [2,4,4,4,1,1]

到目前为止,我已经确定了需要更改的项目。

double = [x for x in List1 if len(x)>1]
print(double)

[[(23, 44), (23, 5, 3), (1, 2)], [(23, 5), (1, 6)]]

我找到了这些项目的索引:

indx = [i for y in double for i, x in enumerate(List1) if x== y ]
print(indx)

[1, 2]

我已经展平了嵌套列表以在 list1 中获得我想要的内容:

flat_list = [item for sublist in List1 for item in sublist]

[(3, 4, 5), (23, 44), (23, 5, 3), (1, 2), (23, 5), (1, 6)]

但是我不确定如何更改 list2。

任何帮助将不胜感激。

谢谢你。

标签: pythonlisttuples

解决方案


一种方法(这些问题往往引出的神秘单线):

l1, l2 = zip(*((tpl, scr) for tpls, scr in zip(List1, List2) for tpl in tpls))
l1
# ((3, 4, 5), (23, 44), (23, 5, 3), (1, 2), (23, 5), (1, 6))
l2
# (2, 4, 4, 4, 1, 1)

嵌套的生成器表达式生成元组分数对,并且该zip(*...)模式将它们转置为我们通过多重赋值捕获的两个单独的元组。如果需要,您可以轻松地将它们转换为列表。

一种更具可读性和对初学者友好的方式:

tuples, scores = [], []
for tpls, scr in zip(List1, List2):
    for tpl in tpls:
        tuples.append(tpl)
        scores.append(scr)

tuples
# [(3, 4, 5), (23, 44), (23, 5, 3), (1, 2), (23, 5), (1, 6)]
scores
# [2, 4, 4, 4, 1, 1]

推荐阅读