добавить ключ, если соответствует определенному индексу и ключевому слову?

#python #dictionary

#python #словарь

Вопрос:

 titleValues = {'Movie 1 (1998)': ['0', '1', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'], 'Movie 2 (1994)': ['0', '1', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '1', '1', '0', '0']}

categories={'unknown': '0', 'Action': '1', 'Adventure': '2', 'Animation': '3', "Children's": '4', 'Comedy': '5', 'Crime': '6', 'Documentary': '7', 'Drama': '8', 'Fantasy': '9', 'Film-Noir': '10', 'Horror': '11', 'Musical': '12', 'Mystery': '13', 'Romance': '14', 'Sci-Fi': '15', 'Thriller': '16', 'War': '17', 'Western': '18'}

selectedCol = 1

titles=[]
for key, value in titleValues.items():
 for num in value:
  if num == '1':
   valIdx = value.index(num)
  if valIdx == selectedCol:
   titles.append(key)
  else: 
   continue
print(titles)
 

вывод:

    ['Movie 1 (1998)', 'Movie 1 (1998)', 'Movie 2 (1994)', 'Movie 2 (1994)', 'Movie 2 (1994)', 'Movie 2 (1994)']
 

Я думаю, что он появляется 6 раз из-за шести вхождений ‘1’. Однако, как я могу получить только два имени, поскольку для обоих списков «1» отображается в индексе 1.

 ['Movie 1 (1998)', 'Movie 2 (1994)']
 

Комментарии:

1. чего вы хотите достичь? только когда titleValues содержит единицу, помещать ключ один раз в список?

2. да, если titleValues содержит единицу, а ее значение at также имеет только индекс 1, то введите ключ.

Ответ №1:

только когда titleValues содержит единицу, поместите ключ один раз в список:

 titles = [k for k,v in zip(titleValues.keys(),titleValues.values()) if '1' in v]
 

результат будет

 print(titles)
# ['Movie 1 (1998)', 'Movie 2 (1994)']
 

Объяснение

  1. Создайте две итерации (ключи, значения)
 print(titleValues.keys())
#dict_keys(['Movie 1 (1998)', 'Movie 2 (1994)'])
print(titleValues.values())
#dict_values([['0', '1', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'], ['0', '1', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '1', '1', '0', '0']])
 
  1. zip, это функция для поэлементной и одновременной итерации по двум итерациям
 print(list(zip(titleValues.keys(),titleValues.values())))
# [('Movie 1 (1998)', ['0', '1', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0']), ('Movie 2 (1994)', ['0', '1', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '1', '1', '0', '0'])]
 
  1. для понимания вы можете получить доступ к элементам обеих итераций (указанное имя переменной: k для элемента в первой итерации и v для элемента во второй)

Комментарии:

1. не могли бы вы объяснить функцию zip в этом случае?

2. yes отредактирует ответ и добавит объяснение

3. нет необходимости в молнии, но вы уловили суть. Вы также можете добавить второй тест : titles = [k for k, v in titleValues.items() if '1' in v and v.index('1') == selectedCol]