【问题标题】:choosing right data structure to parse a file选择正确的数据结构来解析文件
【发布时间】:2015-03-18 21:16:03
【问题描述】:

我有一个 csv 文件,其内容格式如下:

CSE110, Mon, 1:00 PM, Fri, 1:00 PM
CSE114, Mon, 8:00 AM, Wed, 8:00 AM, Fri, 8:00 AM

基本上是课程名称,然后是时间。

解析和存储这些数据的最佳数据结构是什么?

我尝试如下使用命名元组:

CourseTimes = namedtuple('CourseTimes', 'course_name, day, start_time ')

但如上面 cse114 所示,可以在多天多时间安排一门课程。这只能在运行时决定。如何处理?

否则,我可以使用字典或列表吗?

我正在尝试解决将助教分配给课程的时间安排问题。我可能需要比较时间来检查将来是否有任何碰撞

为了使事情复杂化,输入文件还有其他数据需要我解析。基本上以下是格式。

//Course times
CSE110, Mon, 1:00 PM, Fri, 1:00 PM
CSE114, Mon, 8:00 AM, Wed, 8:00 AM, Fri, 8:00 AM
....

//Course recitation times
CSE306, Mon, 2:30 PM
CSE307, Fri, 4:00 PM
...

//class strength
CSE101, 44, yes
CSE101, 115, yes
...

我想我需要将所有这些存储在单独的数据结构中。每个类别的正确正则表达式模式是什么?

【问题讨论】:

  • 您需要构建数据以适应您将要使用它做什么
  • 正确的数据结构取决于你想对数据做什么。如果您只想打印数据,那么您只需要一个大字符串。如果您需要排序或计数或执行其他操作,那么这些操作会通知您选择数据结构。
  • 为什么不使用dictionary
  • 我正在尝试解决调度问题,以便将 TA 分配给课程。我可能需要比较时间来检查将来是否有任何碰撞。
  • 那么给定输入内容(例如课程名称?日期?),您需要检索哪些信息?枚举此处所需的操作时,需要彻底。

标签: python regex csv data-structures namedtuple


【解决方案1】:

首先要注意有关数据的一些事项:

  1. 您有许多唯一的字符串(课程)
  2. 每门课程结束后,都有一些字符串(班级每周开会的次数)

这样,您就有了一系列唯一键,每个键都有多个值。

对我来说听起来像 dictionary

要将这些数据放入字典,请以 reading the file 开头。接下来,您可以使用regular expressions 选择每个[day], [hour]:[minutes] [AM/PM] 部分,也可以使用普通的旧string.split() 以逗号分隔行。课程字符串是字典的键,该行的其余部分作为元组或值列表。移到下一行。

【讨论】:

    【解决方案2】:
    {
        'CSE110': {'Mon': ['8: 00 AM'], 'Wed': ['8: 00 AM'], 'Fri': ['8: 00 AM'], 
        'CSE110': {'Mon': ['1: 00 PM'], 'Fri': ['1: 00 PM']}
    }
    

    这种形式的字典。同一天的课程可以有多个时段。

    当您阅读 csv 文件时,您会为课程和当天创建(如果它不存在)并为其分配单个元素列表以用于计时。如果课程和日期的值已经存在,您只需追加到现有列表。这意味着该课程在同一天有多个上课时间。

    您不需要正则表达式来查找输入行的类别。 您拥有的第一种和第二种类型(即单天和多天)可以像

    l = line.split(', ')
    try:
        n = int(l[1]) # n = strength
    except:
        #continue adding to dictionary since second element in the list is not an integer
    

    【讨论】:

    • 听起来不错。另外,找到这样的模式的正确正则表达式模式是什么?请检查主帖中的编辑。谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多