【问题标题】:Ordering and filtering data from csv.dictreader从 csv.dictreader 排序和过滤数据
【发布时间】:2019-01-09 22:41:31
【问题描述】:
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 行?

我之前尝试过一个简单的列表,但我在访问此值时收到错误,不知道该怎么做。

请指教。谢谢

【问题讨论】:

  • 你是对的。那么现在为什么要使用 next 呢?它用于跳过标题行,但如果您在 csv dict 阅读器中使用它,您只会丢失一行数据。
  • @Jean-FrançoisFabre,好点,csv 文件中可能有一个空/未使用的行。鉴于输出 OP 得到它似乎他们正在正确阅读。

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


【解决方案1】:

一种方法是对字典列表进行排序并选择前 10 个元素。您可以通过sorted 和自定义函数来实现这一点:

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

说明

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

【讨论】:

  • 不过,我更喜欢heapq 方法。
  • @Jean-FrançoisFabre,是的,你说得对,它效率更高。希望有人会发布;这应该是此类问题的推荐做法。
  • 我应该读取dict中的数据并获得前10名的价格和room_id。我该如何去链接它?
  • How do I go about linking it? 抱歉,我不明白上述解决方案中的哪一点不清楚。 data_list 与您的问题完全相同。
  • 我试图从包含数千行的 data_list 中检索带有 room_id 的价格。我显示的示例列表是其中的 1 行
【解决方案2】:

重用jpp answer的正确key函数,使用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分隔符,无需指定

【讨论】:

    猜你喜欢
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2013-12-23
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多