代码之家  ›  专栏  ›  技术社区  ›  anon

比较列表中的列

  •  0
  • anon  · 技术社区  · 6 年前

    我已经对csv文件(下面给出的链接)进行了拆分,下面给出了我的数据输出。我不需要什么帮助来比较 国家 列并仅返回仅在美国制作的电影名称。我该怎么做?

    data = open("movie_metadata.csv", "r").read().split("\\n")
    movie_data = [i.split(",") for i in data]
    print(movie_data[1:4])
    
    output:
    [['movie_title','director_name','color','duration','actor_1_name','language',
      'country','title_year'],
    ['Avatar','James Cameron','Color','178','CCH Pounder','English','USA',
     '2009'],
    ["Pirates of the Caribbean: At World's End",'Gore Verbinski','Color',
     '169','Johnny Depp','English','USA','2007'],
    ['Spectre','Sam Mendes','Color','148','Christoph Waltz','English','UK',
     '2015']]
    

    CSV File

    4 回复  |  直到 6 年前
        1
  •  2
  •   munk    6 年前

    您要根据“国家/地区”列筛选列表。

    us_movies = [movie for movie in movies if movie[6] == 'USA'] 
    

    如果您愿意,也可以将行转换为标题。

    us_movie_titles = [movie[0] for movie in movies if movie[6] == 'USA']
    

    如果需要匹配谓词结果的对应列表,则可以:

    is_match = [movie[6] == 'USA' for movie in movies]
    

    注意,前两个列表的大小可能比原始列表小,但“是匹配”的大小和顺序与原始列表相同。

    要将布尔值添加到完整数据集,请执行以下操作:

    movies_with_usa = [m[0] + [m[1]] for m in zip(movies, is_match)]
    

    但您真正拥有的是命名数据,所以它可能更适合于字典或对象。此外,如果您正在读取一个csv文件,则csv阅读器是标准库的一部分。所以对于一些更强大的东西

    import csv
    
    def read_data(filename):
        with open(filename) as f:
            reader = csv.DictReader(f)
            return [row for row in reader]     
    
    def match(record, field, value):
        return record[field] == value
    
    data = read_data("movie_metadata.csv")
    us_movies = [record for record in data if match(record, 'country', 'USA')]      
    
        2
  •  1
  •   W Stokvis    6 年前

    你想用一个 pandas 然后您可以很容易地根据列进行筛选。

    import pandas as pd
    df = pd.DataFrame(movie_data[1:],columns = movie_data[0])
                                    movie_title   director_name  color duration     actor_1_name language country title_year
    0                                    Avatar   James Cameron  Color      178      CCH Pounder  English     USA       2009
    1  Pirates of the Caribbean: At World\'s End  Gore Verbinski  Color      169      Johnny Depp  English     USA       2007
    2                                   Spectre      Sam Mendes  Color      148  Christoph Waltz  English      UK       2015
    
    df[df.country == "USA"]
                                    movie_title   director_name  color duration actor_1_name language country title_year
    0                                    Avatar   James Cameron  Color      178  CCH Pounder  English     USA       2009
    1  Pirates of the Caribbean: At World\'s End  Gore Verbinski  Color      169  Johnny Depp  English     USA       2007
    
        3
  •  1
  •   Archibald    6 年前

    可能您正在寻找一个没有任何第三方库(即只有标准库)的通用解决方案。我们开始:

    def filter_by(csv_data, column_name, column_value):
        indices = [i for i, name in enumerate(data[0]) if name == column_name]
        if not indices:
            return
        index = indices[0]
        for row in data[1:]:
            if row[index] == column_value:
                yield row
    

    这就是你如何使用它:

    print(list(filter_by(movie_data, "country", "USA")))
    

    这将输出(为了清晰起见,我将其格式化了一点):

    [
        ['Avatar', 'James Cameron', 'Color', '178', 'CCH Pounder', 'English', 'USA', '2009'],
        ["Pirates of the Caribbean: At World's End", 'Gore Verbinski', 'Color', '169', 'Johnny Depp', 'English', 'USA', '2007']
    ]
    
        4
  •  1
  •   Eduardo Soares    6 年前

    只需遍历所有电影并比较第7列:

     made_usa = []   
    
     for l in movie_data:
            if l[6] == 'USA':
              made_usa.append(l)
    
     print (made_usa)
    

    要只添加电影名称,只需执行以下操作:

         made_usa = []   
    
         for l in movie_data:
                if l[6] == 'USA':
                  made_usa.append(l[0])
    
          print (made_usa)
    

    要保存是否匹配,可以使用如下字典:

         made_usa = {}
    
         for l in movie_data:
                if l[6] == 'USA':
                  made_usa.update({l[0]: 'True'})
                else:
                  made_usa.update({l[0]: 'False'}) 
         print (made_usa)
    

    在那之后,如果你想看看某个动作是不是在美国做的。您需要做的就是,例如:

    print(made_usa['Avatar'])
    

    输出:

    'True'