Заменить элементы в списке на элементы в кортеже - PullRequest
0 голосов
/ 27 ноября 2018

В настоящее время я пытаюсь объединить имена лицензий в пакетах rpm.

Поэтому я анализирую rpms, получаю информацию о лицензии в виде списков и хочу сравнить этот список с созданной мной таблицей поиска.

Вот пример:

lic = ['GPLv2', ' & ', 'LGPLv2+', ' & ', 'LGPLv2.1+', ' | ', 'LGPLv3+']

duplicates = (
            ('GPL-2.0', 'GPL-2', 'GPLv2', 'GPLv2.0'),
            ('GPL-2.0+', 'GPL-2+', 'GPLv2+', 'GPLv2.0+'),
            ('GPL-3.0', 'GPL-3', 'GPLv3', 'GPLv3.0'),
            ('GPL-3.0+', 'GPL-3+', 'GPLv3+', 'GPLv3.0+'),
            ('LGPL-2.0', 'LGPLv2.0', 'LGPLv2', 'LGPL2'),
            ('LGPL-2.0+', 'LGPLv2.0+', 'LGPLv2+', 'LGPL2+'),
            ('LGPL-2.1', 'LGPLv2.1', 'LGPL2.1'),
            ('LGPL-2.1+', 'LGPLv2.1+', 'LGPL2.1+'),
            ('LGPL-3.0', 'LGPLv3.0', 'LGPLv3', 'LGPL3'),
            ('LGPL-3.0+', 'LGPLv3.0+', 'LGPLv3+', 'LGPL3+')
            )

Что было бы наиболее эффективным и наиболее питоническим способом замены всех вхождений любого элемента в duplicates в lic на соответствующий первый элемент каждого кортежа?

например: GPLv2 необходимо заменить на GPL-2.0 , LGPLv2 + на LGPL-2.0 + и т. Д..

Я на Python 3.5.2

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вы можете выполнить итерацию по вашему lic и сравнить каждый из его элементов с duplicates, и, если найдете совпадение, заменить этот элемент первым элементом соответствующего кортежа.

lic = ['GPLv2', ' & ', 'LGPLv2+', ' & ', 'LGPLv2.1+', ' | ', 'LGPLv3+']

duplicates = (
            ('GPL-2.0', 'GPL-2', 'GPLv2', 'GPLv2.0'),
            ('GPL-2.0+', 'GPL-2+', 'GPLv2+', 'GPLv2.0+'),
            ('GPL-3.0', 'GPL-3', 'GPLv3', 'GPLv3.0'),
            ('GPL-3.0+', 'GPL-3+', 'GPLv3+', 'GPLv3.0+'),
            ('LGPL-2.0', 'LGPLv2.0', 'LGPLv2', 'LGPL2'),
            ('LGPL-2.0+', 'LGPLv2.0+', 'LGPLv2+', 'LGPL2+'),
            ('LGPL-2.1', 'LGPLv2.1', 'LGPL2.1'),
            ('LGPL-2.1+', 'LGPLv2.1+', 'LGPL2.1+'),
            ('LGPL-3.0', 'LGPLv3.0', 'LGPLv3', 'LGPL3'),
            ('LGPL-3.0+', 'LGPLv3.0+', 'LGPLv3+', 'LGPL3+')
            )

for idx, i in enumerate(lic):
    for match in duplicates:
        if i in match:
            lic[idx] = match[0]
            break

print(lic)

Вывод:

['GPL-2.0', ' & ', 'LGPL-2.0+', ' & ', 'LGPL-2.1+', ' | ', 'LGPL-3.0+']
0 голосов
/ 27 ноября 2018

Я бы сначала изменил кортеж duplicates кортежей на dict.вот так:

duplicates = {k: v for k, *v in duplicates}  # {'GPL-2.0': ['GPL-2', 'GPLv2', 'GPLv2.0'], ...}

, а затем выполните:

lic_clean = [next((k for k, v in duplicates.items() if x in v), x) for x in lic]

, что дает:

['GPL-2.0', ' & ', 'LGPL-2.0+', ' & ', 'LGPL-2.1+', ' | ', 'LGPL-3.0+']
...