Преобразовать два списка в один

Рейтинг: 0Ответов: 2Опубликовано: 25.07.2023

Есть два списка с именами, телефонами и ключами
(BMW, AUDI, Berlin, Praga),
: разделитель.

Нужно проверить, являются ли ключи в каждом элементе списка name полностью равны ключам любого из элементов phone. Если есть совпадения, то вывести список с первым значением каждого элемента name и phone согласно ключам, то есть имя и телефон.

name = ['Alex:Praga:BMW', 'Kolya:Berlin:Audi', 'Greg:Paris:Ford', 'John:Paris:Ford']
phone = ['74957758888:Berlin:Audi', '74999224831:Paris:Ford', '74952122159:Praga:BMW']

result = ['Alex:74952122159', 'Kolya:74957758888', 'Greg:74999224831', 'John:74999224831']

Ответы

▲ 1Принят

Я не особо уверен в правильности вашей архитектуры, но допускаю, что двум людям может принадлежать один номер. Тогда можно реализовать следующий алгоритм. Соберем каждое значение и разобьем по :, а затем сверим ключи имён и ключи телефонов (name_key и phone_key соответственно)

def get_matching_phones(name_list, phone_list):
    output_list = []
    for name_entry in name_list:
        name_parts = name_entry.split(':')
        name_key = name_parts[1] + ':' + name_parts[2]

        for phone_entry in phone_list:
            phone_parts = phone_entry.split(':')
            phone_key = phone_parts[1] + ':' + phone_parts[2]

            if name_key == phone_key:
                output_list.append(f"{name_parts[0]}:{phone_parts[0]}")
                break

    return output_list

Я немного изменил входные данные, чтобы обогатить тест.

name = ['Alex:Praga:BMW', 'Kolya:Berlin:Audi', 'Greg:Paris:Ford', 'John:Paris:Ford', 'Acinit:Samara:Lada', 'Acinit:Berlin:Audi']
phone = ['74957758888:Berlin:Audi', '74999224831:Paris:Ford','79053455232:Samara:Lada', '74952122159:Praga:BMW','74999212345:Berlin:Audi']

result = get_matching_phones(name, phone)
print(result)

Вывод в терминале:

['Alex:74952122159', 'Kolya:74957758888', 'Greg:74999224831', 'John:74999224831', 'Acinit:79053455232', 'Acinit:74957758888']

p.s. здесь мы можем видеть проблему того, что у Acinit ожидаются по ключу Berlin:Audi номер 74999212345, но вместо этого он берет самый первый в списке подходящий аргумент, а именно номер Kolya - 74957758888.

Если данное считается ошибкой, сообщите об этом в комментариях

▲ 1

Как вариант:

name = ['Alex:Praga:BMW', 'Kolya:Berlin:Audi', 'Greg:Paris:Ford', 'John:Paris:Ford']
phone = ['74957758888:Berlin:Audi', '74999224831:Paris:Ford', '74952122159:Praga:BMW']

name = {v[:v.find(':')]: v[v.find(':'):] for v in name}
phone = {v[v.find(':'):]: v[:v.find(':')] for v in phone}

list_rez = []
for k, v in name.items():
    r = phone.get(v)
    if r:
        list_rez.append(f'{k}:{r}')

print(*list_rez)