2016-11-17 2 views
0

, простирающихся от этого question, мне нужно максимально быстро решения этой проблемы:быстрый способу сравнить массивы

Учитывая следующее:

m=['abc','bcd','cde','def'] 
r=[['abc','def'],['bcd','cde'],['abc','def','bcd']] 

Я хотел бы изменить эти объекты (или произведен новые объекты), так что для каждого элемента в списке m, если он существует менее чем в 2 раза по всем спискам r, элемент удаляется из m, а также из того места, где он встречается в r.

Таким образом, результат выше будет выглядеть следующим образом:

['abc','bcd','def'] 

... потому что «CDE» встречается только один раз в г.

Еще лучше было бы это:

[2, 2, 1, 2] 

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

Так, например, удалите индекс i каждого списка по r, если i < 2 или> 100.

Существует круглый о способ сделать это, но медленнее, чем мелассы в январе:

Моя точка является то, что это:

[[1 if mx in rx else 0 for mx in m] for rx in map(set, r)] 

будет производить это:

[[1, 0, 0, 1], [0, 1, 1, 0], [1, 1, 0, 1]] 

Заранее благодарим!

+0

на "удалить из' M' и везде в 'r'" кажется, что вы хотите, чтобы он был извлечен для другого использования - правильно? кажется важным различием. –

+2

Вместо того, чтобы зависеть от абсолютного самого быстрого метода, от верхней части моей головы я бы сгладил список 'r', сортировал сплющенный список, затем подсчитывал количество последовательных идентичных записей и поиск' m', чтобы найти, если вы сохранить запись или нет. –

+0

@Tadhg McDonald-Jensen - Да, это важно. Мне не нужны элементы после их удаления. –

ответ

2

Вот линии, чтобы получить отсчеты:

print [sum([1 for _r in r if _m in _r]) for _m in m] 

Это дает тот же результат, вы написали:

[2, 2, 1, 2] 
+0

Отличный старт. Все, что мне нужно сделать, это использовать индекс 1 в результирующем списке (index = 2), чтобы сообщить исходному списку, что 'cde' (местоположение индекса 2) необходимо удалить из всех подписок, поэтому результатом является r = [['abc', 'def'], ['bcd'], ['abc', 'def', 'bcd']]. Я также хотел бы сделать то же самое, если итоговое значение было> 100. –

+0

Я добавлю следующий вопрос, основанный на моем комментарии выше. –

+0

любым способом ускорить решение? У меня большой набор данных, и, пока он работает в течение трех микросекунд на моих образцовых данных, требуется большой объем данных. Спасибо за любую помощь, которую вы можете предоставить. –