Поиск элементов в списке таким образом, чтобы элементы не имели одинаковых номеров - PullRequest
0 голосов
/ 26 мая 2019

Рассмотрим list = [23,52,44,32,78] 23,52,32. Все эти элементы имеют хотя бы одну общую цифру, поэтому набор, который я хочу отфильтровать, равен [44,78], поскольку у них нет общих чисел.

Другой пример: [52,12,255,211,223,123,64,87,999]будет отфильтрован как [64,87,999]

Моя текущая идея состоит в том, чтобы преобразовать все числа в список, как [2,3], [5,2] ... и взять их пересечение, но я не смогпонять, как сравнить все эти подсписки и отфильтровать нужные числа.

def convert_into_sublist(i):
    sublist = [int(x) for x in str(i)] 

def intersection(l1, l2): 
    l3 = [value for value in l1 if value in l2]
    if(len(l3)==0):
        return 1

Ответы [ 2 ]

2 голосов
/ 26 мая 2019

обрабатывает числа как список символов и использует set преобразование и проверяет, не пересекаются ли. Может быть, не самый производительный однострочный, но работает:

lst = [23,52,44,32,78]
# optional: remove duplicates:
lst = set(lst)

unique = [l for l in lst if all(set(str(x)).isdisjoint(str(l)) for x in lst if x != l)]

результат:

>>> unique
[44, 78]

может быть немного быстрее: преобразовать в строку один раз, обработать строки, в конце преобразовать обратно в целые числа:

lst = [str(x) for x in lst]
unique = [int(l) for l in lst if all(set(x).isdisjoint(l) for x in lst if x != l)]
0 голосов
/ 26 мая 2019

Вы можете использовать Counter, чтобы найти необычные цифры:

from collections import Counter
from itertools import chain
from operator import itemgetter

lst = [23, 52, 44, 32, 78]

sets = [set(str(i)) for i in lst]
# [{'3', '2'}, {'5', '2'}, {'4'}, {'3', '2'}, {'7', '8'}]

c = Counter(chain.from_iterable(sets))
# Counter({'2': 3, '3': 2, '5': 1, '4': 1, '7': 1, '8': 1})

new_lst = []
for num, set_ in zip(lst, sets):
    counts = itemgetter(*set_)(c)
    if counts == 1 or set(counts) == {1}:
        new_lst.append(num)

print(new_lst)
# [44, 78]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...