如果列表Y上存在列表X元素,则在其位置之前切片列表X.

时间:2018-04-02 23:26:23

标签: python python-3.x list dictionary indexing

TL; DR :需要在列表A上对数据进行切片,其中元素也出现在列表B上。

嗨,我正在尝试比较我从HTTP GET请求收到的数据。

第一个名单叫做SUBJECTS,我列出了提供给我课程的所有科目。第二个名单叫做DETAILS,我有一些关于这些主题的细节,包括他们的名字。两个列表的顺序相同。注意:某些科目可以提供多个课程。帖子末尾的输入和输出示例。

我的问题是我需要精确定位并分离每个主题的数据以发送到我的数据库。我考虑比较两个列表并在主题名称显示时保存索引,但我无法正确使用。

这是我到目前为止尝试的代码之一:

def format(details, subject):
    indexes = []
    x = details
    indices = [details.index(x) for x in subject]
    enum = list(enumerate(indexes))
    for i in range(enum[0][1], enum[-1][1]):
        if i in enum[:][1]:
            print("\n\n")
        print(details[enum[i][1]], end=" ")

我希望我足够清楚。提前谢谢!

编辑

示例输入数据

SUBJECT = ['EPRI02 - ADMINISTRAÇÃO', 'ECAI06.1 - AUTOMAÇÃO DE SISTEMAS INDUSTRIAIS I', 'ECA022.2 - Automação e Supervisão de Processos II (Prática)']

DETAILS = ['EPRI02 - ADMINISTRAÇÃO', '2018.1', 'IGOR AZEVEDO DOS SANTOS CITTY ROSA (32h)', 'REGULAR', 'Presencial', 'ABERTA', '6T45', 'Anexo 1 - Sala 5', '90/91 alunos', 
'ECAI06.1 - AUTOMAÇÃO DE SISTEMAS INDUSTRIAIS I', '2018.1', 'LUIZ FELIPE PUGLIESE (32h)', 'REGULAR', 'Presencial', 'ABERTA', '6M45', 'Anexo 3 - Sala 11', '13/24 alunos', 
'ECA022.2 - Automação e Supervisão de Processos II (Prática)', '2018.1', 'LUIZ FELIPE PUGLIESE (32h)', 'REGULAR', 'Presencial', 'ABERTA', '5M23', 'Prédio 2 - Sala 2211', '9/12 alunos', '2018.1', 'LUIZ FELIPE PUGLIESE (32h)', 'REGULAR', 'Presencial', 'ABERTA', '5T12', 'Prédio 2 - Sala 2211', '11/12 alunos']

示例输出数据

SUBJECT1 = ['EPRI02 - ADMINISTRAÇÃO', '2018.1', 'IGOR AZEVEDO DOS SANTOS CITTY ROSA (32h)', 'REGULAR', 'Presencial', 'ABERTA', '6T45', 'Anexo 1 - Sala 5', '90/91 alunos']

SUBJECT2 = ['ECAI06.1 - AUTOMAÇÃO DE SISTEMAS INDUSTRIAIS I', '2018.1', 'LUIZ FELIPE PUGLIESE (32h)', 'REGULAR', 'Presencial', 'ABERTA', '6M45', 'Anexo 3 - Sala 11', '13/24 alunos']

SUBJECT3 = ['ECA022.2 - Automação e Supervisão de Processos II (Prática)', '2018.1', 'LUIZ FELIPE PUGLIESE (32h)', 'REGULAR', 'Presencial', 'ABERTA', '5M23', 'Prédio 2 - Sala 2211', '9/12 alunos', '2018.1', 'LUIZ FELIPE PUGLIESE (32h)', 'REGULAR', 'Presencial', 'ABERTA', '5T12', 'Prédio 2 - Sala 2211', '11/12 alunos']

1 个答案:

答案 0 :(得分:1)

整理数据的一种方法是使用collections.defaultdict

from collections import defaultdict

SUBJECT = ['EPRI02 - ADMINISTRAÇÃO', 'ECAI06.1 - AUTOMAÇÃO DE SISTEMAS INDUSTRIAIS I', 'ECA022.2 - Automação e Supervisão de Processos II (Prática)']

DETAILS = ['EPRI02 - ADMINISTRAÇÃO', '2018.1', 'IGOR AZEVEDO DOS SANTOS CITTY ROSA (32h)', 'REGULAR', 'Presencial', 'ABERTA', '6T45', 'Anexo 1 - Sala 5', '90/91 alunos', 
'ECAI06.1 - AUTOMAÇÃO DE SISTEMAS INDUSTRIAIS I', '2018.1', 'LUIZ FELIPE PUGLIESE (32h)', 'REGULAR', 'Presencial', 'ABERTA', '6M45', 'Anexo 3 - Sala 11', '13/24 alunos', 
'ECA022.2 - Automação e Supervisão de Processos II (Prática)', '2018.1', 'LUIZ FELIPE PUGLIESE (32h)', 'REGULAR', 'Presencial', 'ABERTA', '5M23', 'Prédio 2 - Sala 2211', '9/12 alunos', '2018.1', 'LUIZ FELIPE PUGLIESE (32h)', 'REGULAR', 'Presencial', 'ABERTA', '5T12', 'Prédio 2 - Sala 2211', '11/12 alunos']

d = defaultdict(list)
subjects = set(SUBJECT)

for item in DETAILS:
    if item in subjects:
        current_item = item
    else:
        d[current_item].append(item)

结果:

defaultdict(<class 'list'>, {'EPRI02 - ADMINISTRAÇÃO': ['2018.1', 'IGOR AZEVEDO DOS SANTOS CITTY ROSA (32h)', 'REGULAR', 'Presencial', 'ABERTA', '6T45', 'Anexo 1 - Sala 5', '90/91 alunos'],
                             'ECAI06.1 - AUTOMAÇÃO DE SISTEMAS INDUSTRIAIS I': ['2018.1', 'LUIZ FELIPE PUGLIESE (32h)', 'REGULAR', 'Presencial', 'ABERTA', '6M45', 'Anexo 3 - Sala 11', '13/24 alunos'],
                             'ECA022.2 - Automação e Supervisão de Processos II (Prática)': ['2018.1', 'LUIZ FELIPE PUGLIESE (32h)', 'REGULAR', 'Presencial', 'ABERTA', '5M23', 'Prédio 2 - Sala 2211', '9/12 alunos', '2018.1', 'LUIZ FELIPE PUGLIESE (32h)', 'REGULAR', 'Presencial', 'ABERTA', '5T12', 'Prédio 2 - Sala 2211', '11/12 alunos']})

然后,您可以通过标准词典表示法轻松访问与特定主题相关的DETAILS。

使用字典的好处是您不依赖于维护索引映射。要向主题添加其他相关详细信息,您只需执行d['BAC024 - MATEMÁTICA VI'].append('Presencial')