Я хочу создать словарь, чтобы каждое слово имело уникальную цель для внедрения слов. Набор данных выглядит так:
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). Это слишком медленно, и я хочу найти решение для повышения производительности, но на данный момент я понятия не имею.
Попробуйте следующий код с itertools.chain
. В моем тестовом примере он работает быстрее x4:
from itertools import chain
start = 2
{it: n + start for n, it in enumerate(set(chain(*s_lists)))}
Вы можете использовать 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}
>>>
Попробуйте что-то вроде этого,
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}