Словарь для сопоставления строк в списке с числами в Python - PullRequest
0 голосов
/ 06 июня 2019

У меня есть список строк с некоторыми повторениями. например (не фактический список)

["hello", "goodbye", "hi", "how are you", "hi"]

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

[0, 1, 2, 3, 2]

, где 0 = "привет", 1 = "до свидания" и т. Д.

Я посмотрел пример здесь: Преобразование списка целых чисел в список предопределенных строк в Python

Я хочу сделать в основном то же самое, но наоборот, строки в целые числа. Эта часть не должна быть слишком сложной.

Однако они, кажется, просто создают словарь в своем коде так:

trans = {0: 'abc', 1: 'f', 2: 'z'}

Создание словаря самостоятельно - это хорошо, если вы знаете точное содержание вашего списка. Мой список строк очень длинный, и я не знаю, что это за строки, поскольку они поступают из ввода. Поэтому мне нужно сделать словарь из моего списка строк другим способом, например, циклом for.

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

Другими словами, я хотел бы знать, как просмотреть список, подобный моему списку строк выше, и создать словарь, подобный:

{"hello": 0, "goodbye": 1, "hi": 2, "how are you": 3}

РЕДАКТИРОВАТЬ: у меня было много ответов, спасибо всем за вашу помощь. Что меня сейчас смущает, так это разные способы сделать это Было много предложений, используя enumerate(), set() и другие функции. Был также один ответ (@ChristianIacobs), который сделал это очень просто с помощью цикла for. Что мне интересно, так это то, есть ли причина использовать один из чуть менее простых ответов? Например, они быстрее или в некоторых ситуациях они работают только так?

Ответы [ 8 ]

0 голосов
/ 06 июня 2019

Вы можете попробовать что-то следующим образом:

vocab_dict = {word: index for index, word in enumerate(list(set(words)))}

Содержимое вышеупомянутого vocab_dict, если список слов взят из приведенного примера, будет выглядеть примерно так:

>> vocab_dict {'how are you': 0, 'hello': 1, 'goodbye': 2, 'hi': 3}

0 голосов
/ 06 июня 2019

Вот моя идея. Это будет объяснено в комментариях. Предположим, у вас есть файл, содержащий только слова.

import re         #Import the re module
phrases = {}       #Create a dictionary
file = open("/path/to/file", "r")       #Open the file containing all your phrases. 
Data = file.read()    #Read the file. 
cleanedData = re.split("[\s | \r | \n]", Data)    #Remove whitespace. 
for word in cleanedData:
    if not word in phrases:      #Check if the word is already in your dictionary. 
        phrases[word] = (len(phrases)+1)    #Sets the word as a key with a value starting at 1 and automatically increasing, but only adds it if it doesn't already exist. 
file.close()
0 голосов
/ 06 июня 2019

Ответ очень прост. Вы можете сделать это всего за 2 строки.

Код -

l = ['hello', 'goodbye', 'hi', 'how are you', 'hi']
{a: b for b,a in enumerate(l)}

Здесь перечислить создать кортеж (индекс, значение), который затем Comprehend с циклом for

0 голосов
/ 06 июня 2019

Чтобы создать словарь из вашего списка, сначала нужно избавиться от повторяющихся значений. Используйте набор для достижения этого:

my_list = ["hello", "goodbye", "hi", "how are you", "hi"]
unique_list = list(set(my_list))

['hi', 'hello', 'goodbye', 'how are you']

Теперь вы можете создать свой словарь, архивируя unique_list с диапазоном чисел:

my_dict = dict(zip(unique_list, range(len(unique_list))))

{'hi': 0, 'hello': 1, 'goodbye': 2, 'how are you': 3}
0 голосов
/ 06 июня 2019

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

Тогда процесс выглядит следующим образом:

  • определяет set ключей, которые нам нужны (каждый элемент в исходном списке).

  • Назначьте каждому значение - самый простой способ - снова сделать list этого набора (поскольку по определению элементы теперь уникальны) и использовать индекс элементов в этом списке. Чтобы построить это отображение, мы можем использовать трюк с enumerate в соответствии с тем, что @jonrsharpe уже предлагал.

  • Перевести исходный список через отображение.

Таким образом:

keys = list(set(original))
mapping = {k:v for v,k in enumerate(keys)}
result = [mapping[k] for k in original]
0 голосов
/ 06 июня 2019
words = ["hello", "goodbye", "hi", "how are you", "hi"]

d = dict()
i = 0
for word in words:
    if word not in d:
        d[word] = i
        i += 1
print(d)
#print(sorted(d.items(), key=lambda kv: kv[1])) print them sorted
0 голосов
/ 06 июня 2019

Вы можете сделать это с помощью следующих шагов:

  • избавиться от повторяющихся слов, используя set
  • сопоставить уникальные слова с уникальным числом (массив index), используя enumerate
  • цикл над словами, чтобы получить их присвоенный номер

Вы можете получить ожидаемый результат с помощью фрагмента ниже.

words = ["hello", "goodbye", "hi", "how are you", "hi"]
unique_words = set(words)
words_map = {word: i for i, word in enumerate(unique_words)}

result = [words_map[word] for word in words]
print(result)
0 голосов
/ 06 июня 2019

Попробуйте это:

>>> w = ["hello", "goodbye", "hi", "how are you", "hi"]
>>> l = [0, 1, 2, 3, 2]
>>> trans = {l1:w1 for w1,l1 in zip(w,l)}
>>> trans
{0: 'hello', 1: 'goodbye', 2: 'hi', 3: 'how are you'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...