【问题标题】:Sorting sentences of text file by users input根据用户输入对文本文件的句子进行排序
【发布时间】:2020-05-22 03:10:28
【问题描述】:

我的代码是根据句子的长度对文件中的句子进行排序,然后保存到一个新文件中。

如何更改我的代码,以便如果用户在程序启动时输入任何数字,我们会根据该输入过滤行。

示例:用户输入 50 - 程序将对长度大于 50 的所有句子进行排序,或者如果用户输入 all,则程序将正常对所有行进行排序。

我的代码:

file = open("testing_for_tools.txt", "r")
lines_ = file.readlines()
#print(lines_)
user_input = input("enter")
if user_input is int:
    lines = sorted(lines_, key=len)
else:
    lines = sorted(lines_, key=len)
# lines.sort()
file_out = open('testing_for_tools_sorted.txt', 'w')
file_out.write(''.join(lines))  # Write a sequence of strings to a file
file_out.close()
file.close()
print(lines)

【问题讨论】:

    标签: python-3.x file sorting input sentence


    【解决方案1】:
    • 输入总是返回一个字符串,如果你想要一个整数或类似的东西,你需要明确地解析它,你永远不会从input中得到一个整数。
    • is 不是 python 中的类型测试原语,它是 identity 原语。它检查左右是否是同一个对象,那就是it
    • filter 是您在此处寻找的内容,或 列表理解:如果用户提供了一个输入 并且该输入是一个有效的整数,那么您想要过滤行只到指定长度以上的那些。这是与排序不同的步骤。

    除此之外,

    • 您应该使用with 来管理文件,除非有特殊原因您不能或不能
    • 文件有一个writelines 方法,它应该比编写连接线更有效
    • 永远不要永远在不提供编码的情况下以文本模式打开文件,否则 Python 会要求系统提供编码,并且该系统很容易被错误配置或奇怪的配置导致垃圾输入
    with open("testing_for_tools.txt", "r", encoding='utf-8') as f:
        lines_ = file.readlines()
    
    #print(lines_)
    user_input = input("enter")
    if user_input:
        try:
            limit = int(user_input.strip())
        except ValueError:
            pass
        else:
            lines_ = (l for l in lines_ if len(l) >= limit)
    
    lines = sorted(lines_, key=len)
    with open('testing_for_tools_sorted.txt', 'w', encoding='utf-8') as f:
        f.writelines(lines)
    print(lines)
    

    【讨论】:

    • 您的 try\expect 子句是一个非常糟糕的编码示例。它应该至少警告用户(最好让他们重试)。
    【解决方案2】:

    @黑雪 如果它按预期工作,我没有其他要回答的问题。 这是一个相当长的答案:

    idx_to_sort = [True if len(i)>int(user_input) else False for i in lines_]
    idx_to_sort
    
    lines_to_sort = []
    for i in range(len(idx_to_sort)):
        if idx_to_sort[i]:
            lines_to_sort.append(lines_[i])
    
    lines_to_sort
    
    lines = sorted(lines_to_sort, key=len)
    lines
    
    counter=0
    for i in range(len(idx_to_sort)):
        if idx_to_sort[i]:
            lines_[i] = lines[counter]
            counter += 1
    lines_
    

    输出会有所不同,但不是您的预期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多