用数字键以某种格式排序字典

时间:2016-03-21 20:34:04

标签: python python-3.x dictionary

我不知道如何标题,所以也欢迎对标题提出建议。 我正在创建一个程序,它将从文件中读取数据并按顺序打印。

该文件将始终包含基于此的数据:

  • 名称:1,2,3
  • NAME_2:4,5,6
  • NAME_3:10,9,8

这是我从文件中获取数据的代码:

def getData(file):
    data = {}
    try:
        with open(file + ".txt", "r") as file:
            for line in file:
                build = line.split(":")
                data[build[0]] = build[1]
    except FileNotFoundError:
        with open(file + ".txt", "a") as file:
            pass
    return data

返回的数据是:

data = {"Name": "1,2,3\n", "Name_2": "4,5,6\n", "Name_3": "10,9,8\n"

现在我已经获得了数据,我正在尝试“排序”它,字典不是真的可以排序,所以我使用了“OrderedDict”。下面是代码:

def sortData(data, choice):
    ## Sort By Average
    if choice == "Average":
        for name, score in data.items():
            amount = 0
            for i in re.finditer("[0-9]{1,2}", score):
                amount += 1
            average  = eval(re.sub(",","+",score))/amount
            data[name] = str(average) + "\n"
        od_data = collections.OrderedDict(sorted(data.items(), key=lambda t:float(t[1]), reverse=True))
        for name, score in od_data.items():
            sys.stdout.write("%s: %s" % (name, score))
    ## Sort By Highest - Lowest
    elif choice == "Highest - Lowest":
        od_data = collections.OrderedDict(sorted(data.items(), key=lambda t:t[1], reverse=True))
        for name, score in od_data.items:
            sys.stdout.write("%s: %s" % (name, score)

当选择为“平均”时,数据按照预期和按顺序打印。当选择“最高 - 最低”时,数据将按顺序打印出来:

  • NAME_2:4,5,6
  • 名称:1,2,3
  • NAME_3:10,9,8

它应该工作,只有当第一个“数字”不是“10”时,由于某种原因它似乎在程序中注册为“1”和“0”,因此最终成为最低的条目。

2 个答案:

答案 0 :(得分:0)

不是使用reeval,而是split,map(或{{} int字符串。 1}}),可以在加载文件时直接使用。然后其余部分变得更加容易。

float

在你的第二部分中,对于>>> data = {"Name": "1,2,3\n", "Name_2": "4,5,6\n", "Name_3": "10,9,8\n"} >>> data = {k: [int(x) for x in v.split(',')] for k, v in data.items()} >>> collections.OrderedDict(sorted(data.items(), key=lambda item: sum(item[1]) / len(item[1]), reverse=True)) OrderedDict([('Name_3', [10, 9, 8]), ('Name_2', [4, 5, 6]), ('Name', [1, 2, 3])]) ,并不完全清楚你想要如何排序。如果你想按照它们的自然顺序对列表进行排序 - 比较是第一个元素,如果它们等于第二个,依此类推 - 然后排序(data.items(),key = lambda t:t [ 1],reverse = True)choice == "Highest - Lowest" t [1] in itself is correct, but data`仍然是一个字符串,所以你只是按字符串的字典顺序排序。您必须首先转换为整数列表,如上所述。

如果您希望按这些列表的最小元素排序,可以尝试:

from

另请注意,您根本不需要将排序结果包装到>>> collections.OrderedDict(sorted(data.items(), key=lambda item: min(item[1]))) # or max for maximum 中,因为您只需迭代项目。只需直接使用OrderedDict的结果即可。另外,我建议在调用函数之前将数据更改为整个列表。总而言之,您可以将代码更改为以下内容:

sorted

答案 1 :(得分:0)

问题在于程序不会根据所有值对它们进行排序。我对@tobias_k使用了一个建议,非常有用,并用它实现了另一个代码:

最终代码:

data = {k: [int(x) for x in v.split(',')] for k, v in data.items()}
        od_data = collections.OrderedDict(sorted(data.items(), key=operator.itemgetter(1), reverse=True))
        print(od_data)

现在打印:

  

OrderedDict([(&#39; Jeff&#39;,[10,10,10]),(&#39; Max&#39;,[9,0]),(&#39; How&#39 ;,[6,2,3]),(&#39; What&#39;,[6,1]),(&#39; Jefferson&#39;,[6]),(&#39; Henry&# 39;,[5,5,5]),(&#39;为什么&#39;,[5,5,4]),(&#39; Harry&#39;,[5,4])])< / p>

(我添加了几个例子来正确测试它。)