【问题标题】:Picking out only values that match a number from a list仅从列表中挑选出与数字匹配的值
【发布时间】:2013-05-21 21:46:53
【问题描述】:

我创建了一个文件,其中包含我公司的所有数据,作为带有列表的 CSV 文件夹。

文件夹以名称、年龄、加入年份、退出年份为列,如下所示:

Name, Age, Join Year, Exit Year
Mark , 19 , 2001      na 
Mike,  30 , 2000      na

我试图隔离所有从 2000 年开始的人。到目前为止,我的代码显示为

import csv

with open('Confidential.csv', 'rU') as input: 
    dL= list(csv.reader(input))
    sL = dL
    print sL[2]

这会打印出所有麦克风数据,因为我知道这是dL 中的行号。

我想知道的是有一种更简单的方法来显示从 2000 年开始的每个人。比如有没有我可以编写的代码来搜索从 2000 年开始的任何人,如果可以,那么它可以在行中显示这些人的数据人们。

if raw_input = 2000
find all 2000 
print line data for any  line that contains 2000?
Like mike, 30, 2000, na because that matches 2000 :)

这是可能的还是我最好坚持使用原始代码并单独输入每个人的行号?

【问题讨论】:

  • 请在您的问题中添加 [python] 标签。

标签: python list sorting csv import-from-csv


【解决方案1】:

print filter(lambda xs:xs[2]==raw_input(), sL);

我想这就是你要找的东西。

剩余:map()、filter() 和任何其他使用函数式编程范式的方法都没有副作用。换句话说,总是捕获返回的值。

【讨论】:

    【解决方案2】:

    您可以使用 filter 内置函数在 python 中轻松过滤列表。在你的情况下,试试这个:

    import csv
    
    def started_in_2000(person):
        return person[2] == '2000'
    
    with open('Confidential.csv', 'rU') as input: 
    
        all_people= list(csv.reader(input))
    
        people_who_started_in_2000 = filter(started_in_2000, all_people)
    
        for person in people_who_started_in_2000:
            print person
    

    filter 接受两个参数:一个列表,以及一个在传递列表中的项目时返回 true 或 false 的函数。在本例中,我创建了一个函数,当一个人在 2000 年开始时返回 true,并过滤了使用该函数的人员列表。

    有关过滤器的更多信息,请查看 python 文档:http://docs.python.org/2/library/functions.html#filter

    【讨论】:

      【解决方案3】:

      如果您打算对数据进行更多查询,最好将其转换为数据库。

      Python 与sqlite 兼容,这是一个不需要服务器并从简单文件运行的数据库。您可以将其视为具有高级功能的 CSV。

      所以,这里是 SQlite 方式:

      import csv
      import sqlite3  # This imports the drivers for sqlite that come with Python
      
      database_file = 'employees.db'
      conn = sqlite3.connect(database_file)  # Creates a new database, or
                                             # opens a connection to the file
                                             # if it already exists
      
      cur = conn.cursor()  #  A cursor, that we use to execute queries
      
      q = "CREATE TABLE IF NOT EXISTS Employees (Name, Age, JoinYear, ExitYear);"
      cur.execute(q)  # Creates a new Employees table if it doesn't exist
      
      with open('Confidential.csv', 'rb') as f:
          reader = csv.DictReader(f)
          for row in reader:
              q = """INSERT INTO Employees
                        (Name, Age, JoinYear, ExitYear)
                     VALUES (?,?,?,?);"""
              cur.execute(q,row)
              conn.commit()
      
      # Now we can do stuff like this
      
      q = "SELECT * FROM Employees WHERE JoinYear = 2000;"
      for result in cur.execute(q):
          print("{} {} {} {}".format(*result)
      

      不仅如此,假设您要找出所有小于 30 岁的员工?

      q = "SELECT * FROM Employees WHERE Age < 30;"
      

      所有“吉姆”:

      q = "SELECT * FROM Employees WHERE Name = 'Jim';"
      

      每年有多少员工加入?

      q = "SELECT COUNT(*) AS 'Total', Year FROM Employees GROUP BY Year;"
      

      【讨论】:

        【解决方案4】:

        进行此类操作的最佳模块是pandas。你可以在10 Minutes to pandas找到一个非常简短的介绍

        对于您的问题,解决方案很简单

        In [1]: import pandas
        In [2]: data = pandas.read_csv('Confidential.csv', delimiter=',', na_values=['na'], skipinitialspace=True)
        In [3]: data     # printing the read data
        Out[3]: 
                   Name    Age  Join Year  Exit Year
                0  Mark    19       2001        NaN
                1  Mike    30       2000        NaN
        
        In [3]: data[data['Join Year'] > 2000]   # slicing the required data 
        Out[3]: 
                   Name    Age  Join Year  Exit Year
                0  Mark    19       2001        NaN
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-29
          • 1970-01-01
          • 2020-06-25
          相关资源
          最近更新 更多