Замена элементов в списке значениями из словаря - PullRequest
1 голос
/ 21 апреля 2020

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

genre_list = ['action, drama, thriller', 'crime, romance, adventure']

list_new = []

categories_ids = {'action': '18',
                  'drama': '13',
                  'thriller': '11',
                  'romance': '1',
                  'adventure': '8',
                  'crime': '3'
                  }

print(len(genre_list)) # length before

for z in genre_list:
    for a, b in categories_ids.items():
        if a in z:
            list_temp = z.replace(z, b)
            list_new.append(list_temp)

print(len(list_new)) # length after

Что мне здесь не хватает? Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 21 апреля 2020

Вы добавляете к list_new каждый элемент из categories, который появляется в каждом элементе genre_list - первые 3 клавиши появляются в первом элементе genre_list, а остальные 3 клавиши появляются во втором элементе genre_list - поэтому в list_new будет всего 6 элементов.

Попробуйте вместо:

genre_list = ['action, drama, thriller', 'crime, romance, adventure'] 

list_new = []                                                         

categories_ids = {'action': '18',                                     
                  'drama': '13',                                      
                  'thriller': '11',                                   
                  'romance': '1',                                     
                  'adventure': '8',                                   
                  'crime': '3'                                        
                  }                                                   

for z in genre_list:                                                  
    for a, b in categories_ids.items():                               
        z = z.replace(a, b)                                           
    list_new.append(z) # here is the difference - one append per element in genre_list                                               

print(list_new) # output:['18, 13, 11', '3, 1, 8']                                                      

1 голос
/ 21 апреля 2020

Каждый элемент списка содержит более 1 ключа, поэтому вы получите больше элементов в новом списке. Это может быть обработано, как показано ниже.

for z in genre_list:
    key_words=''
    for key in z.split(','):
        if key.strip() in categories_ids:
            key_words += categories_ids[key.strip()] +','
    list_new.append(key_words[:-1])

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

2 ['action, drama, thriller', 'криминал, романтика, приключения']

2 ['18, 13,11 ',' 3,1,8 ']

1 голос
/ 21 апреля 2020

вы добавляете новые элементы к вашему new_list, если ключ из вашего dict находится в одной строке из genre_list, но genre_list имеет в одной строке несколько ключей из вашего dict, так что вы в конечном итоге получаете несколько строк / элементов в вашем new_list


вы можете использовать регулярное выражение со списком:

import re

genre_list = ['action, drama, thriller', 'crime, romance, adventure']
pattern = '|'.join(categories_ids)
def replace(gr):
    return categories_ids[gr.group()]

list_new = [re.sub(pattern, replace, t) for t in genre_list]
# ['18, 13, 11', '3, 1, 8']
1 голос
/ 21 апреля 2020

Использование:

def func(s):
    return ", ".join(categories_ids[w] for w in s.split(", "))

list_new = list(map(func, genre_list))
print(list_new)

Печать:

['18, 13, 11', '3, 1, 8']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...