【问题标题】:Problems with sorting a dictionary from a txt.file in ascending order从 txt.file 中按升序排序字典的问题
【发布时间】:2021-12-23 09:43:08
【问题描述】:

我在对包含升序字符串和数字的文本文件中的字典进行排序时遇到问题。输出部分正确,但并非字典中的所有组件都以正确的顺序输出。

我正在使用的字典组装如下:

a 103,5
b 407,7
c 394,98
d 20,7
e 3,78

所以我的代码部分正确地打印了字典,但某些值的顺序仍然错误,例如:

e 3,78
d 20,7
c 394,98
a 103,5
b 407,7

这里,c 和 a 应该交换位置,因为 a 旁边的值小于 c 的值。这是一些代码:

a_dictionary = {}
file = open("example.txt")
for line in file:
    value, key = line.split()
    a_dictionary[value] = key

sort_file = sorted(a_dictionary.items(), key=lambda x: x[1])

for i in sort_file:
    print(i[0], i[1])

【问题讨论】:

  • 您为什么将字典的键命名为value 并将其值命名为key?这只是令人困惑!

标签: python sorting dictionary


【解决方案1】:

您不应该依赖任何特定顺序的字典。 Python(现在)确实做出了某些保证,但这不是好的做法。在这种情况下,您实际上并不需要字典。为什么不直接创建一个元组列表?

此外,您将数据保存在字符串中。当存储为字符串时,数值数据不能很好地排序。 “100”小于“2”,这让很多人感到不安。

mydata = []
file = open("example.txt")
for line in file:
    data = line.rstrip().split()
    mydata.append( (data[0], float(data[1])) )

mysort = sorted(mydata, key=lambda x: x[1])

for i in mysort:
    print(i[0], i[1])

【讨论】:

    【解决方案2】:

    您的字典的值类型是str,这意味着'103,5' 被视为字符串,而不是数字。我不确定你是如何得到你给的命令的,但是当我运行你的代码时,我得到了以下命令:

    a 103,5
    d 20,7
    e 3,78
    c 394,98
    b 407,7
    

    正在比较第二个值按字母顺序。因为“1”在“2”之前,所以“103,5”是第一个值。就像“apple”出现在“bus”之前一样。所以你可以看到它的顺序是 1、2、3、39、4。

    要解决此问题,您需要将字典值转换为 float。但是因为您的输入使用的是逗号而不是小数,所以您不能只使用float(value)。如果这是因为您所在的国家/地区对此很规范,您应该使用locale.atof 而不是float。在此之后,如果您仍然需要输出使用逗号而不是小数位,则需要使用locale.str 格式化输出。

    import locale
    
    a_dictionary = {}
    file = open("example.txt")
    for line in file:
        key, value = line.split()
        value = locale.atof(value)
        a_dictionary[key] = value
    
    sort_file = sorted(a_dictionary.items(), key=lambda x: x[1])
    
    for i in sort_file:
        print(i[0], locale.str(i[1]))
    

    如果我的假设是错误的,并且由于语言环境的原因您没有逗号,那么您可以使用字符串 replace 函数将逗号替换为小数点。

    我还交换了keyvalue,你把它们倒过来了。字典由键索引。

    正如 Tim Roberts 所指出的,您在这里似乎并不需要字典。除非问题比我们从您的帖子中了解的更多。

    【讨论】:

      【解决方案3】:

      问题是您将每个字典值中的两个数字排序为单个字符串,因此它们按字母顺序进行比较,而不是按数字进行比较。这可以通过将字符串拆分为两个数字来纠正,然后将它们转换为一对整数值(并将其用作排序键)。

      with open("example.txt") as file:
          a_dictionary = dict(line.split() for line in file)
      
      sort_file = sorted(a_dictionary.items(), key=lambda p: tuple(map(int, p[1].split(','))))
      
      for i in sort_file:
          print(i[0], i[1])
      

      输出:

      e 3,78
      d 20,7
      a 103,5
      c 394,98
      b 407,7
      

      【讨论】:

      • 我不认为字典值是用逗号分隔的两个数字,我认为逗号是小数点。 OP 将其称为可以与其他值进行比较的单个值。同时使用空格和逗号来分隔输入文件中的数据也没有多大意义。他们可能来自一个翻转小数和逗号的欧洲国家。
      • @TechnoSam:你可能是对的……很难从问题中看出什么来。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 2014-11-29
      • 2020-12-10
      • 2021-10-01
      • 2020-08-03
      • 1970-01-01
      相关资源
      最近更新 更多