2016-07-18 2 views
3

Я постоянно создаю случайно сгенерированный список, New_X размера 10, на основе 500 столбцов.Эффективный способ поиска в списке списков?

Каждый раз, когда я создаю новый список, он должен быть уникальным, и моя функция NewList возвращает только New_X, когда он еще не был создан и прилагаемое к List_Of_Xs

def NewList(Old_List): 

end = True 
while end == True: 

    """ Here is code that generates my new sorted list, it is a combination of elements 
     from Old_List and the other remaining columns, 
     but the details aren't necessary for this question. """ 

    end = (List_Of_Xs == np.array([New_X])).all(axis=1).any() 

List_Of_Xs.append(New_X) 
return New_X 

Мой вопрос, является line end = (List_Of_Xs == np.array([New_X])).all(axis=1).any() эффективный способ посмотреть в List_Of_Xs?

Мой List_Of_Xs может вырасти до размера более 100 000 списков, поэтому я не уверен, что это неэффективно или нет.

Любая помощь будет оценена!

+0

Итак, это 'List_Of_Xs' список списков с 10 элементами в списке? Являются ли эти элементы целыми? Есть ли верхняя и нижняя граница этих ints? – Divakar

+0

Я бы сделал 'New_X' кортеж и проверил, находится ли он в наборе' Set_of_Xs'. Особенно с небольшим списком из 10 элементов, которые должны быть быстрее, чем при сравнении этого массива. – hpaulj

+0

'List_of_Xs == np.array ([New_X])' не только делает 'New_X' в массив, но он делает это для' List_of_Xs' каждый раз. Создание массива из списка списков не является тривиальной задачей. – hpaulj

ответ

1

Как я заметил в комментарии, сравнение массивов является потенциально довольно медленным, особенно, поскольку список становится большим. Он должен каждый раз создавать массивы, которые потребляют время.

Вот набор реализация

Функция создать список, состоящий из 10 элементов:

def foo(N=10): 
    return np.random.randint(0,10,N).tolist() 

Функция для создания списков, и напечатать уникальные из них

def foo1(m=10): 
    Set_of_Xs = set() 
    while len(Set_of_Xs)<m: 
     NewX = foo(10) 
     tx = tuple(NewX) 
     if not tx in Set_of_Xs: 
      print(NewX) 
      Set_of_Xs.add(tx) 
    return Set_of_Xs 

Пример запуска. Как написано, он не показывает, есть ли дубликаты.

In [214]: foo1(5) 
[9, 4, 3, 0, 9, 4, 9, 5, 6, 3] 
[1, 8, 0, 3, 0, 0, 4, 0, 0, 5] 
[6, 7, 2, 0, 6, 9, 0, 7, 0, 8] 
[9, 5, 6, 3, 3, 5, 6, 9, 6, 9] 
[9, 2, 6, 0, 2, 7, 2, 0, 0, 4] 
Out[214]: 
{(1, 8, 0, 3, 0, 0, 4, 0, 0, 5), 
(6, 7, 2, 0, 6, 9, 0, 7, 0, 8), 
(9, 2, 6, 0, 2, 7, 2, 0, 0, 4), 
(9, 4, 3, 0, 9, 4, 9, 5, 6, 3), 
(9, 5, 6, 3, 3, 5, 6, 9, 6, 9)} 
+0

спасибо, это закончилось тем, что мой «Set_of_Xs» стал довольно большим. Считаете ли вы, что было бы проще, если бы моя функция 'NewX' создала их в форме кортежа? –

+1

Преобразование списка в кортеж (или обратно) не имеет большого значения. Просто «set» требует «кортежа» (поскольку он неизменен). – hpaulj

1

Итак, позвольте мне получить это прямо, так как код не отображается полная: 1. Вы старый список, который постоянно растет с каждой итерации 2. Вы вычислить список 3. Вы сравните его с каждым из списки в старом списке, чтобы увидеть, следует ли вам разорвать цикл?

Один из вариантов - сохранить списки в наборе вместо списка списка. Сравнение элемента со всеми элементами списка будет представлять собой операцию O (n) для каждой итерации. Используя набор, он должен быть O (1) avg ... Хотя вы можете получать O (n) каждую итерацию до последней.

Другие мысли состоят в том, чтобы вычислить md5 каждого элемента и сравнить их, чтобы вы не сравнивали полные списки.

+0

Старый список не постоянно растет на каждой итерации. Каждый старый список хранится в List_Of_Xs, и каждый новый список сравнивается с List_Of_Xs, если новый список еще не находится в List_Of_Xs, цикл прерывается. –

Смежные вопросы