2016-06-15 2 views
0

Я ищу, чтобы узнать вероятность комбинации параметров с помощью моделирования Монте-Карло. У меня есть 4 параметра, и каждый может иметь около 250 значений. Я случайно генерировал 250 000 сценариев для каждого из этих параметров, используя некоторую функцию распределения вероятности. Теперь я хочу узнать, какие комбинации параметров наиболее вероятны. Для этого я начал с фильтрации любых дубликатов из моих 250 000 случайно сгенерированных выборок, чтобы уменьшить длину списка. Затем я повторил этот сокращенный список и проверил, сколько раз каждый сценарий возникает в первоначальном 250 000 длинном списке.Быстрая сортировка больших вложенных списков

У меня есть большой список 250000 пунктов, который содержит списки, как таковые:

a = [[1,2,5,8],[1,2,5,8],[3,4,5,6],[3,4,5,7],....,[3,4,5,7]]# len(a) is equal to 250,000 

Я хочу найти быстрый и эффективный способ иметь каждый список в моем списке только однократный.

Конечная цель - подсчет вхождения каждого списка в список a.

до сих пор я получил:

'''Removing duplicates from list a and storing this as a new list temp''' 
b_set = set(tuple(x) for x in a) 
temp = [ list(x) for x in b_set ] 
temp.sort(key = lambda x: a.index(x))  

''' I then iterate through each of my possible lists (i.e. temp) and count how many times they occur in a''' 
most_likely_dict = {} 
for scenario in temp: 
    freq = list(scenario_list).count(scenario) 
    most_likely_dict[str(scenario)] = freq 

на данный момент она занимает хорошие 15 минут, чтобы выполнить ... Любое предложение о том, как превратить это в несколько секунд, было бы весьма признателен !!

+0

Какова реальная проблема, которую вы пытаетесь решить с этим? Вероятно, если вам нужно два повторного сортировки списка каждый раз, когда вы делаете что-то не оптимальное. Не могли бы вы предоставить какой-то контекст? – jonrsharpe

+0

Я добавил немного контекста в начале вопроса. Я в основном хочу знать, сколько раз каждый список в большом списке происходит. Каждый вложенный список представляет собой возможную комбинацию параметров для моей проблемы и вместо того, чтобы моделировать все возможные комбинации, я хочу сосредоточиться на 4 наиболее вероятных. – Sorade

+1

Почему бы вам просто не сделать ['Counter (map (tuple, a))'] (https://docs.python.org/2/library/collections.html#collections.Counter)? Это даст вам, например. '{(1, 2, 5, 8): 2, ...}', без необходимости сортировки. – jonrsharpe

ответ

1

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

>>> a = [[1,2],[1,2],[3,4,5],[3,4,5], [3,4,5]] 
>>> a_tupled = [tuple(i) for i in a] 
>>> b_set = set(a_tupled) 
>>> {repr(i): a_tupled.count(i) for i in b_set} 
{'(1, 2)': 2, '(3, 4, 5)': 3} 

призывающую list на ваших кортежей добавит больше накладных расходов, но вы можете, если вы хотите

>>> {repr(list(i)): a_tupled.count(i) for i in b_set} 
{'[3, 4, 5]': 3, '[1, 2]': 2} 

Или просто использовать Counter:

>>> from collections import Counter 
>>> Counter(tuple(i) for i in a) 
0
{str(item):a.count(item) for item in a} 

Вход:

a = [[1,2,5,8],[1,2,5,8],[3,4,5,6],[3,4,5,7],[3,4,5,7]] 

Выход:

{'[3, 4, 5, 6]': 1, '[1, 2, 5, 8]': 2, '[3, 4, 5, 7]': 2} 
+1

Обратите внимание, что это 'O (n^2)', поскольку 'count' каждый раз перебирает весь список. – jonrsharpe

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