Как создать собственный словарь из списков строк быстрее

1

Фон

Я хочу создать словарь, чтобы каждое слово имело уникальную цель для внедрения слов. Набор данных выглядит так:

s_lists = [['I', 'want', 'to', 'go', 'to', 'the', 'park'],
           ['I', 'want', 'to', 'quit', 'the', 'team']]

Следующая функция заключается в создании словаря

def build_dict(input_list, start=2):
    """
    build dictionary
    start with 2,1 for unknow word,0 for zero padding

    :param input_list:
    :param start:
    :return: custom dictionary
    """

    whole_set = set()
    for current_sub_list in input_list:
         # remove duplicate elements
        current_set = set(current_sub_list)
        # add new element into whole set
        whole_set = whole_set | current_set
    return {ni: indi + start for indi, ni in enumerate(whole_set)}

Он работает и выводит

{'I': 7,'go': 2,'park': 4,'quit': 8, 'team': 6,'the': 5,'to': 9,'want': 3}

Вопрос

Когда я использую его для большого набора данных (около 50 Вт строк), он будет стоить около 30 секунд (ENV mbpr15-i7). Это слишком медленно, и я хочу найти решение для повышения производительности, но на данный момент я понятия не имею.

Теги:
set
algorithm

3 ответа

1
Лучший ответ

Попробуйте следующий код с itertools.chain. В моем тестовом примере он работает быстрее x4:

from itertools import chain

start = 2
{it: n + start for n, it in enumerate(set(chain(*s_lists)))}
  • 0
    Потрясающие! он работает почти в 200 раз быстрее при подаче набора данных 50 Вт. Большое спасибо :)
1

Вы можете использовать chain и count с itertools

>>> from itertools import chain,count
>>> 
>>> dict(zip(set(chain(*s_lists)), count(2)))
{'team': 2, 'park': 3, 'want': 4, 'I': 5, 'the': 6, 'quit': 7, 'to': 8, 'go': 9}
>>> 
0

Попробуйте что-то вроде этого,

flatern_s_lists = [item for sub_item in s_lists for item in sub_item]
result = {j:i+2 for i,j in enumerate(set(flatern_s_lists))}

Составление списка списков, чтобы обещать это лучший вариант в случае скорости выполнения.

Результат:

{'quit': 2, 'I': 3, 'park': 4, 'to': 5, 'want': 6, 'team': 7, 'go': 8, 'the': 9}
  • 1
    Да, намного лучше, чем у меня, но чуть медленнее, чем решение @Kopytok. Точнее он стоит 0,2474 с по сравнению с 0,1053 с (данные 50 Вт). Это достаточно просто понять, кстати :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню