#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 в список. (Добавить означает добавить элемент в конец списка). Он делает это для каждого элемента, пока вы не получите результат, который я показывал ранее.