Python удаляет похожие элементы из списка

#python #list #reduce #similarity

#python #Список #уменьшить #сходство

Вопрос:

Используя python, в следующем списке мне нужно удалить телефонные номера, которые повторяются с кодами стран.

 ['( 44)45860787163','( 27)16345860787','45860787163','16345860787']
 

Я попытался использовать декартово произведение и оператор ‘in’ для сравнения строк, но, похоже, ничего не работает.
Я бы хотел сохранить полные номера телефонов.

 ['( 44)45860787163','( 27)16345860787']
 

Комментарии:

1. У вас есть строка со списком в ней или список строк?

2. У меня это как список строк

3. приведенный вами пример — это строка? он заключен в ''

4. Я предложил редактировать список строк, предполагая, что это была опечатка.

5. вы пробовали решение для регулярных выражений?

Ответ №1:

Используя регулярное выражение, вы можете извлечь нужную вам часть, затем, используя dict, вы можете связать число с его префиксом (и избежать перезаписи префикса)

 value = '( 44)45860787163,( 27)16345860787,45860787163,16345860787'
phones = {}

for phone, prefix, number in re.findall(r"((( d ))?(d ))", value):
    if prefix != "" or number not in phone:
        phones[number] = prefix

result = ",".join(v   k for k, v in phones.items())
print(result)  # ( 44)45860787163,( 27)16345860787
 

Ответ №2:

Использование понимания списка

 l = ['( 44)45860787163','( 27)16345860787','45860787163','16345860787']

l = [x for x in l if '(' in x]

print(l)

>>> ['( 44)45860787163', '( 27)16345860787']
 

Если вы хотите быть в большей безопасности, вы можете проверить наличие обеих точек с запятой

 l = [x for x in l if '(' in x and ')' in x]

 

Комментарии:

1. OP хочет сохранить телефонные номера с ( xx) . Это делает обратное

2. Это была моя первая мысль о том, как подойти к этому, но я думаю, что OP хочет вернуть числа с кодами областей

Ответ №3:

Прежде всего, мы получаем все телефонные номера. Затем мы создаем словарь с номером без расширения в качестве ключа и расширением в качестве значения. Если число не имеет расширения, ему присваивается значение None. После, если мы найдем тот же номер с расширением, Ни один из них не будет заменен расширением. В конце мы печатаем номер с соответствующим расширением.

 numbers = '( 44)45860787163,( 27)16345860787,45860787163,16345860787'.split(',')
d = dict()
for number in numbers:
    if ')' in number:
        prefix, n = number.split(')')
        prefix = prefix   ')'
    else:
        prefix = None
        n = number
    if n in d.keys():
        if d[n] == None:
            d[n] = prefix
    else:
        d[n] = prefix
print([k if v == None else v   k for k,v in d.items()])
 

Ответ №4:

Вы можете использовать это решение:

 number_string = '( 44)45860787163,( 27)16345860787,45860787163,16345860787'

result = []

for phone_number in number_string.split(','):
    if "(" in phone_number:
        result.append(phone_number)

print(result)