Python - Удалить значение из массива, если это значение содержится внутри другого значения - PullRequest
1 голос
/ 15 марта 2020

Например:

array = ['123', '1234', '55', '378', '785455'] ====> ['1234', '378', ' 785455 ']

Мое решение этой задачи совсем неэффективно:

array = ['123', '1234', '55', '378', '785455', '54314', '4324324', '543535', '54']

def remove_contained(arr):
    to_delete = []
    copy_arr = arr.copy()
    for index, value in enumerate(arr):
        for j_index, j_value in enumerate(arr):
            if value in j_value and value != j_value:
                copy_arr.remove(value)
                break

    return copy_arr

Есть ли более эффективный способ сделать это? редактировать: я ищу решение, которое лучше, чем O (n ^ 2) сложность

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

Это может помочь

Поиск в строке, созданной из всех элементов массива, кроме искомого ключа

array = ['123', '1234', '55', '378', '785455', '12', '54314', '4324324', '543535', '54']

new_array = []
for idx, elem in enumerate(array):
  x = " ".join(array[0:idx] + array[idx+1:len(array)]) # creating string from array, except current element variable
  if(elem not in x): 
    new_array.append(elem) # if element is not in the string, append it to new array
print(new_array)
0 голосов
/ 15 марта 2020

Что бы я сделал, это append значения в новый list вместо копирования старого list и удаления значений из него, а также избавления от enumerate, который там ничего не делает:

from timeit import timeit


array = ['123', '1234', '55', '378', '785455', '54314', '4324324', '543535', '54']*1000


def remove_contained(arr):
    to_delete = []
    copy_arr = arr.copy()
    for index, value in enumerate(arr):
        for j_index, j_value in enumerate(arr):
            if value in j_value and value != j_value:
                copy_arr.remove(value)
                break

    return copy_arr

def remove_contained_v2(arr):
    new_arr = []
    for value in arr:
        for other_value in arr:
            if value in other_value and value != other_value:
                new_arr.append(value)
    return new_arr

Затем мы рассчитываем время:

print(timeit("""
remove_contained(array)
""", 'from __main__ import remove_contained, array', number=5
))

print(timeit("""
remove_contained_v2(array)
""", 'from __main__ import remove_contained_v2, array', number=5
))

Оригинал занимает 21.097198000000002, а другая версия 18.412295999999998. Так что быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...