Как добавить значение в ключ, не удаляя предыдущее значение в ключе?

#python

#питон

Вопрос:

Это то, что у меня есть до сих пор:

 newlines = [] diction = {} i = 0 w = 0  f = open('file1.txt') lines = f.readlines()  while i lt;= len(lines)-1:  newlines.append(lines[i].strip('n'))  i  = 1  season= newlines[::2] shows = newlines[1::2] temp_list = []   while w lt;= len(season)-1 and w lt;= len(shows)-1:  diction[season[w]] = shows[w]  if '20' in diction:  temp_list.append(shows[w])  diction['20'] = temp_list  w  = 1  print(diction)  

Исход {«20»: [«Оружейный дым», «Симпсоны», «Уилл и Грейс», «Даллас», «Закон и порядок», «Убийство, Она Написала»], «30»: «Симпсоны», «10»: «Уилл и Грейс», «14»: «Даллас», «12»: «Убийство, Она написала»}

Желаемый результат {«20»: «Оружейный дым», «Закон и порядок», «30»: «Симпсоны», «10»: «Уилл и Грейд», «14»: «Даллас», «12» : «Убийство, Она написала»}

Что file1.txt содержит 20 Оружейный дым 30 Симпсоны 10 Уилл и Грейс 14 Даллас 20 Закон и порядок 12 Убийство, Написала Она

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

1. Ваш желаемый вывод не является допустимым Python.

2. практически вы не можете сделать один ключ dict для нескольких ключей; в противном случае, что a = my_dict["30"] делать? .. хотя существуют его реализации; возможно, вы хотите добавить список в свой диктант? {'20': ['Gunsmoke', 'Law amp; Order'], '30': .. вы также можете выполнять итерацию непосредственно по строкам по файлу, возвращенному из open() .. для line in f:...

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

4. @КлаусД. Да, но идея в том, что ключ » 20 » содержит 2 значения. Я знаю, что это неправильно, я впервые работаю со словарями.

5. @ti7 О, хорошо, я не знал, что ты не можешь добавить к этому вот так. Спасибо.

Ответ №1:

Я объяснил с комментариями.

 f = open('text1.txt')  # Firstly read the text file with splitlines to not struggle with n lines = f.read().splitlines()  diction = {}  print(lines) # Iterate each line # lines = ['20 Gunsmoke', '30 The Simpsons', '10 Will amp; Grace', '14 Dallas', '20 Law amp; Order', '12 Murder, She Wrote'] for line in lines:  # We are splitting the line to take season count and series name  # It split with white space so we should merge the series name after taking the season count  # ex. splitted_line = ['30', 'The', 'Simpsons']  splitted_line = line.split()  # ex. season_count = '20'  season_count = splitted_line[0]  # ex. series_name = 'The'   ' '   'Simpsons'  series_name = ' '.join(splitted_line[1:])    # We can check whether the key we have exist in dictionar or not  if season_count in diction:  # If we have the key in dictionary  # First we should check it is a just string or array of string  # ex. It can be {'20': 'Gunsmoke'}  # We we can came with another series with same season count we should make it array  # ex. {'20': ['Gunsmoke', 'Law amp; Order'] }  # If we have already an array, we can just append it  temp = diction[season_count]  diction[season_count] = [temp, series_name] if isinstance(temp, str) else temp   [series_name]  else:  # If we have not key in dictionary we should add it to dictionary  diction[season_count] = series_name  print(diction)  

Ответ №2:

Желаемый результат невозможен в Python. Однако значения словаря могут быть списками, и вы можете добавлять элементы в эти списки по мере чтения newlines .

Вы можете использовать dict.setdefault метод:

 season= newlines[::2] shows = newlines[1::2]  diction = {} for s, show in zip(season, shows):  diction.setdefault(s,[]).append(show)  

Исход:

 print(diction) # {20: ['Gunsmoke', 'Law amp; Order'], 30: ['The Simpsons'], 10: ['Will amp; Grace'], 14: ['Dallas'], 12: ['Murder, She Wrote']}  

Ответ №3:

Вы можете использовать диктант по умолчанию из библиотеки коллекций

 from collections import defaultdict  data = """20 Gunsmoke  30 The Simpsons  10 Will amp; Grace  14 Dallas 20 Law amp; Order 12 Murder, She Wrote"""  data_dict = defaultdict(list)  for d in data.splitlines():  split = d.index(" ")  show = d[split 1:]  season = d[:split]  data_dict[season].append(show)  print(data_dict)  

выход

 defaultdict(lt;class 'list'gt;, {'20': ['Gunsmoke ', 'Law amp; Order'], '30': ['The Simpsons '], '10': ['Will amp; Grace '], '14': ['Dallas'], '12': ['Murder, She Wrote']})  

Ответ №4:

Старался делать это, меняя как можно меньше кода. Для начала инициализировал список для каждого ключа, а затем просто добавил их, используя свой цикл for. Таким образом, вам не придется жестко проверять наличие » 20 » существующих

 newlines = [] diction = {} i = 0 w = 0  f = open('file.txt') lines = f.readlines()  while i lt;= len(lines)-1:  newlines.append(lines[i].strip('n'))  i  = 1 print(newlines) season = newlines[::2] shows = newlines[1::2] temp_list = []  for s in season:  diction[s] = []  while w lt;= len(season)-1 and w lt;= len(shows)-1:  diction[season[w]].append(shows[w])  w  = 1    print(diction)  

Результат следующий (использует списки для каждого ключа) :

  {'20': ['Gunsmoke', 'Law amp; Order'], '30': ['The Simpsons'], '10': ['Will amp; Grace'], '14': ['Dallas'], '12': ['Murder, She Wrote']}  

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

1. Большое вам спасибо за то, что сделали это так, как я мог понять. Все остальные использовали код, которого я раньше не видел (вероятно, следовало упомянуть, что я новичок в этом посте). Просто чтобы убедиться, что я действительно понимаю, все, что вы делаете, — это создаете пустой список для каждого ключа, который позже будет добавлен с помощью append() правильно?

2. Подождите, не могли бы вы объяснить дикцию[сезон[ш]].добавить(показывает[ш])?

3. Да, не беспокойтесь, все, что он делает, — это добавляет шоу в список соответствующих ключей. Таким образом, все начинается с наличия ключей с каждым из значений сезонов, т. е. 20,30,12 и т.д., Что соответствует пустому списку. Все, что делает эта строка, — это получает список по этому ключу, а затем добавляет в него название шоу. Таким образом, для Gunsmoke он получит ключ «20», а затем добавит gunsmoke в список. (Добавить означает добавить элемент в конец списка). Он делает это для каждого элемента, пока вы не получите результат, который я показывал ранее.