其他子列表中的单独子列表

时间:2019-06-22 16:37:57

标签: python-3.x

我想将列表(alumnos)中的每个子列表都分隔在其他两个列表(rojo和azul)中,考虑名称是否在下一个子列表中,然后我想再创建两个具有各自值的列表。我是python的新手,我的最佳尝试是在下面,但是它不起作用。如果有人可以帮我,我将非常感激。

alumnos = [['Charlie', 'Fran', 'Lucas', 'Mario', 'Juan'], ['Mario', 'Juan'], ['Mario']]
values = [[3, 2.5, 2.8, 1, 1.2], [2, 2.5], [2.8]]
azul = []
rojo = []
azul_va = []
rojo_va = []
cont = 0
while cont<3:
    for l in alumnos[cont]:
        if l in alumnos[cont+1]:
            rojo.append(l)
        else:
            azul.append(l)
    cont += 1
print(f'{alumnos}')
print(rojo)
print(azul)

错误:列表索引超出范围。

输出(预期): rojo_va = [[1,1.2],[2]] azul_va = [[3,2.5,2.8],[2.5],[2.8]]

1 个答案:

答案 0 :(得分:0)

为什么values不在任何地方使用?如果您只是期望连续列表之间的公共值和非公共值,那么下面的代码应该可以工作。

alumnos = [['Charlie', 'Fran', 'Lucas', 'Mario', 'Juan'], ['Mario', 'Juan'], ['Mario']]
values = [[3, 2.5, 2.8, 1, 1.2], [2, 2.5], [2.8]]
azul = []
rojo = []

alumons_values = []
for l, r in zip(alumnos, values):
    n = []
    for l1, r1 in zip(l, r):
        n.append((l1, r1))
    alumons_values.append(n)

get_first = lambda t : list(map(lambda x : x[0], t))
get_second = lambda t : list(map(lambda x : x[1], t))

for l1, l2 in zip(alumons_values, alumons_values[1:]):
    lm1 = get_first(l1)
    lm2 = get_first(l2)
    r = set(lm1) & set(lm2)
    a = set(lm1) - set(lm2)
    ri = [lm1.index(v) for v in lm1 if v in r]
    ai = [lm1.index(v) for v in lm1 if v in a]
    source = get_second(l1)
    rojo.append([source[i] for i in ri])
    azul.append([source[i] for i in ai])

print('Azul :', azul)
print('Rojo :', rojo)


输出:

Azul : [[3, 2.5, 2.8], [2.5]]
Rojo : [[1, 1.2], [2]]