【问题标题】:Python Sorting Dictionaries [duplicate]Python排序字​​典[重复]
【发布时间】:2019-05-14 05:27:34
【问题描述】:

如果我有一个字典,元组中的每个条目都有两个值 例如。 (乔恩,100) (艾莉,200) (马蒂,120) (史蒂夫,250) 我想按照分数(第二个值)的顺序对它们进行排序。但后来我只想显示名称。 例如:史蒂夫、艾莉、马蒂、乔恩 我该怎么办?

f = open('data.csv','r')
reader = csv.reader(f)
new_dict = {}

for row in reader:
    new_dict[row[0]] = random.gauss(float(row[1]), float(row[2]))

order_list = sorted(new_dict, key = new_dict[row[0]], reverse = False)
return order_list

到目前为止,我得到了这个,我也得到了类似的错误

"order_list = sorted(new_dict, key = new_dict[row[0]], reverse = False)"

TypeError: 'float' 对象不可调用

任何帮助都会很重要。

【问题讨论】:

  • “排序字典”是什么意思?你的意思是像this question这样的东西吗?
  • 关键是函数

标签: python sorting dictionary tuples


【解决方案1】:

先用只获取分数的键函数对值进行排序,然后从排序后的数据中获取对的第一项。

from operator import itemgetter
order_list = [e[0] for e in sorted(new_dict.values(), key=itemgetter(1), reverse=True)]

reverse=True 是因为您首先想要得分最高的名称,所以它是降序排序而不是默认的升序。

itemgetter(1) 函数等效于 lambda e: e[1],它也可以工作。

order_list = [e[0] for e in sorted(new_dict.values(), key=lambda e: e[1], reverse=True)]

如果itemgetter(1) 似乎是一种冗长的方法来制作一个简单的 lambda,请注意您可以改用 from operator import itemgetter as ig 然后写成 key=ig(1)

【讨论】:

  • 返回一个可调用对象,该对象使用操作数的 __getitem__() 方法从其操作数中获取项目。如果指定了多个项目,则返回查找值的元组。
  • 还要注意e[1] 等价于e.__getitem__(1)
【解决方案2】:

这就是解决方案。

    import pandas as pd

    def names_ordered_by_score(file_name):
        df = pd.read_csv(file_name, names=['name', 'score'])
        df.sort_values(by='score', inplace=True)
        return df.name.values.tolist()

    names_ordered_by_score('data.csv')

这是一个硬编码测试。

    import pandas as pd

    def names_ordered_by_score():
        df = pd.DataFrame([('jon', 100), 
                           ('ellie', 200), 
                           ('mati', 120)], 
                          columns=['name', 'score'])
        df.sort_values(by='score', inplace=True)
        return df.name.values.tolist()

    names_ordered_by_score()

【讨论】:

  • OP 没有表明他们正在使用 Pandas。这是一个相当繁重的库,需要为此任务导入。
  • 我认为你过于复杂了。这可以在一行中完成。在了解包含电池的基础知识之前,初学者不应开始使用像 pandas 这样的重量级数据处理库。
【解决方案3】:
>>> d = {'ellie': 200, 'jon': 100, 'mati': 120, 'steve': 250}
>>> sorted(d, key=lambda k: d[k])
['jon', 'mati', 'ellie', 'steve']

sorted 将字典视为迭代器,并检索字典的键。

key 参数必须是一个函数(在本例中为未命名函数,lambda),该函数返回当前排序值的排序键。

【讨论】:

  • 这不是描述的数据结构。 “元组中每个条目的两个值”在哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
相关资源
最近更新 更多