Pythoni c способ замены значений в списке по словарю - PullRequest
3 голосов
/ 16 июня 2020

Мне нужно преобразовать значения списка в соответствии со значениями, содержащимися в Python словаре.

У меня есть следующий список:

lst = ["hello", "word", "bye", "my", "friend", "hello"]

И словарь, полученный с использованием кластерная процедура, поэтому ключи - это метки, а значения - категории:

my_dict = {0: ["hello", "word"], 1: ["my", "friend"], 2: ["bye"]}

Мне нужно быстрее преобразовать исходный список в:

new_lst = [0, 0, 2, 1, 1, 0]

Учтите, что в реальном случае длина списка составляет около 60 КБ, поэтому мне нужен эффективный способ выполнить эту операцию.

Ответы [ 3 ]

4 голосов
/ 16 июня 2020
lst = ["hello", "word", "bye", "my", "friend", "hello"]
my_dict = {0: ["hello", "word"], 1: ["my", "friend"], 2: ["bye"]}

inverse_dict = {b:a for a,c in my_dict.items() for b in c}

new_lst = [inverse_dict.get(a) for a in lst]
3 голосов
/ 16 июня 2020

Для тех, кто заинтересован в том, чтобы сделать это в pandas:

my_dict = {0: ["hello", "word"], 1: ["my", "friend"], 2: ["bye"]}
# revert the dict
my_dict_rev = {k2: k for k, v in my_dict.items() for k2 in v}
# convert the list to a pandas Series
ser = pd.Series(["hello", "word", "bye", "my", "friend", "hello"])
# replace the values
rev_ser = ser.replace(my_dict_rev)

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

0 голосов
/ 16 июня 2020

Это легко сделать и с простым списком. Не нужно использовать Pandas.

lst = ["hello", "word", "bye", "my", "friend", "hello"]
my_dict = {0: ["hello", "word"], 1: ["my", "friend"], 2: ["bye"]}

result = []
[result.append(k) for word in lst for k,v in my_dict.items() if word in v]

print(result)

Вывод:

[0, 0, 2, 1, 1, 0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...