如何解决不正确的字母比较错误
Posted
技术标签:
【中文标题】如何解决不正确的字母比较错误【英文标题】:How to solve an error with improper alphabetical comparison 【发布时间】:2021-07-31 11:02:55 【问题描述】:我必须编写一个程序,首先读取输入文件的名称,然后使用 file.readlines() 方法读取输入文件。输入文件包含一个未排序的季数列表,后跟相应的电视节目。程序将输入文件的内容放入字典中,其中季数是键,电视节目列表是值(因为多个节目可能具有相同的季数)。按键(从最小到最大)对字典进行排序,并将结果输出到名为 output_keys.txt 的文件中,用分号 (;) 分隔与同一键关联的多个电视节目。按值(字母顺序)对字典进行排序,并将结果输出到名为 output_titles.txt 的文件中。因此,如果我的输入文件是“file1.txt”并且该文件的内容是:
20
Gunsmoke
30
The Simpsons
10
Will & Grace
14
Dallas
20
Law & Order
12
Murder, She Wrote
文件 output_keys.txt 应包含:
10: Will & Grace
12: Murder, She Wrote
14: Dallas
20: Gunsmoke; Law & Order
30: The Simpsons
并且文件 output_title.txt 包含:
Dallas
Gunsmoke
Law & Order
Murder, She Wrote
The Simpsons
Will & Grace
我的代码工作得很好,我的作业评分很好,除了带有“output_titles.txt”的部分我在代码中写的东西没有按字母顺序排列,我不知道从哪里开始这里。 我的代码是:
inputFilename = input()
keysFilename = 'output_keys.txt'
titlesFilename = 'output_titles.txt'
shows =
with open(inputFilename) as inputFile:
showData = inputFile.readlines()
record_count = int(len(showData) / 2)
for i in range(record_count):
seasons = int(showData[2 * i].strip())
showName = showData[2 * i + 1].strip()
if seasons in shows:
shows[seasons].append(showName)
else:
shows[seasons] = [showName]
with open(keysFilename, 'w') as keysFile:
for season in sorted(shows):
keysFile.write(str(season) + ': ')
keysFile.write('; '.join(shows[season]) + '\n')
with open(titlesFilename, 'w') as titlesFile:
for show_list in sorted(shows.values()):
for show in show_list:
titlesFile.write(show + "\n")
我附上了一张我收到通知的问题的图片:1
我应该怎么做才能具体解决这个问题?
【问题讨论】:
【参考方案1】:这是以后任何查询的正确代码。我目前正在服用 IT-140,它通过了所有测试。如果你按照模块视频中的伪代码行,你会很容易得到这个。
file_name = input()
user_file = open(str(file_name))
output_list = user_file.readlines()
my_dict =
show_list = []
show_list_split = []
for i in range(len(output_list)):
temp_list = []
list_object = output_list[i].strip('\n')
if (i + 1 < len(output_list) and (i % 2 == 0)):
if int(list_object) in my_dict:
my_dict[int(list_object)].append(output_list[i + 1].strip('\n'))
else:
temp_list.append(output_list[i + 1].strip('\n'))
my_dict[int(list_object)] = temp_list
my_dict_sorted_by_keys = dict(sorted(my_dict.items()))
for x in my_dict.keys():
show_list.append(my_dict[x])
for x in show_list:
for i in x:
show_list_split.append(i)
show_list_split = sorted(show_list_split)
f = open('output_keys.txt', 'w')
for key, value in my_dict_sorted_by_keys.items():
f.write(str(key) + ': ')
for item in value[:-1]:
f.write(item + '; ')
else:
f.write(value[-1])
f.write('\n')
f.close()
f = open('output_titles.txt', 'w')
for item in show_list_split:
f.write(item + '\n')
f.close()
【讨论】:
【参考方案2】:那是因为您对字符串列表进行了排序。每个子列表对应不同数量的节目,对大列表进行排序,不对子列表进行排序。只需制作一个简单的节目名称列表并对其进行排序。例如尝试
with open(titlesFilename, 'w') as titlesFile:
for show in sorted(sum(shows.values(), []):
titlesFile.write(show + "\n")
我使用了sum
,因为它简洁直观,但考虑到今天的电视节目数量,它可能会非常慢。为了获得最大的效率,请使用itertools.chain
或很好的理解
sorted((show for show_titles in shows for show in show_titles.values()))
。迭代列表列表之前已经讨论过很多次,例如Concatenation of many lists in Python选择你喜欢的任何方法
【讨论】:
我尝试了您的建议,但它现在运行的所有测试都给了我错误(不仅仅是我之前遇到的问题)。【参考方案3】:这里的问题是shows.values()
迭代的是列表,而不是字符串,所以排序并不能如你所愿。您可以将这些合并到一个列表中,但同样您可以在阅读时首先保留该节目名称列表;所以你的初始解释循环会变成:
allshows = [] # also collect just names
for i in range(record_count):
seasons = int(showData[2 * i].strip())
showName = showData[2 * i + 1].strip()
allshows.append(showName) # collect for later output
if seasons in shows:
shows[seasons].append(showName)
else:
shows[seasons] = [showName]
allshows.sort() # ready for output
然后输出将是对这个额外列表的简单迭代。
【讨论】:
以上是关于如何解决不正确的字母比较错误的主要内容,如果未能解决你的问题,请参考以下文章
如何解决不受信任的证书错误?(TFS2013 Build and deploy to IIS)
当用户的数据连接因 tigase 断开时,我如何解决不获取 XMPP 状态更新的问题
KMM : 如何解决不兼容的 abi 版本。当前默认为“1.4.2”,找到“1.5.0”。 1.5.20编译器产生的库?