如何解决不正确的字母比较错误

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编译器产生的库?

解决不一致的敲除检查绑定

解决不走onActivityResult方法

idea搭建rust开发环境,解决不识别Rust工程的解决办法