从csv.dictreader排序和过滤数据

时间:2018-08-02 08:23:03

标签: python python-3.x csv sorting dictionary

import csv

with open ('data_airbnb.csv', newline='') as f:
    reader = csv.DictReader(f, delimiter = ',')
    data_list = list(reader)

以下是1个示例data_list内容:

[OrderedDict([('room_id', '3179080'), ('survey_id', '1280'), ('host_id', '15295886'), ('room_type', 'Shared room'), ('country', ''), ('city', 'Singapore'), ('borough', ''), ('neighborhood', 'TS17'), ('reviews', '15'), ('overall_satisfaction', '5.0'), ('accommodates', '12'), ('bedrooms', '1.0'), ('bathrooms', ''), ('price', '77.0'), ('minstay', ''), ('last_modified', '2017-05-17 09:10:24.216548'), ('latitude', '1.310862'), ('longitude', '103.858828'), ('location', '0101000020E6100000E738B709F7F659403F1BB96E4AF9F43F')])

亲爱的朋友们,我正在尝试检索具有room_id的价格最高的前10个房间(价格),并从包含数千行的data_list中将它们放入列表。我显示的样本列表是1行吗?

我以前曾尝试过使用它作为简单列表,但是访问此值时却收到错误消息,并且不知道该怎么做。

请咨询。谢谢

2 个答案:

答案 0 :(得分:1)

一种方法是对词典列表进行排序,然后选择前10个元素。您可以通过sorted和自定义函数来实现此目的:

res = sorted(data_list, key=lambda x: float(x['price']), reverse=True)[:10]

说明

  • lambda代表一个匿名函数;您也可以使用具有相同逻辑的显式命名函数。
  • float转换是避免比较字符串的必要条件,该字符串当前用于表示OrderedDict对象中的价格。
  • reverse=True确保我们首先以最高价格订购。
  • 由于sorted返回列表,因此您可以通过[:10]使用常规列表切片来提取前10个元素。

答案 1 :(得分:1)

jpp answer重新使用适当的键功能,您可以使用heapq模块直接获取10个顶部值(保存列表切片,反向标记,但是内部结构相同,Python必须在确定要保留的前10个最高值之前,对列表进行完全排序):

import heapq
top10 = heapq.nlargest(10,data_list,key=lambda x: float(x['price']))

此外,我看到您有一个next(reader)语句,该语句通常在csv阅读器中用于跳过标题行,但是在这里您的标题行已被字典阅读器占用,因此可能是一个错误删除一行数据以及可能有用的信息。修复该错误后,我可以建议的最短代码为:

import heapq,csv
with open ('data_airbnb.csv', newline='') as f:
    top10 = heapq.nlargest(10,csv.DictReader(f),key=lambda x: float(x['price']))
  • 您不必强制转换为list,当数据不在列表中时,此操作由heapq在内部完成(尽管性能可能反而更糟)
  • ,是默认的csv分隔符,无需指定
相关问题