首页 > 解决方案 > 比较列表中的列

问题描述

我已经对 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 文件

标签: pythonpython-3.x

解决方案


您想根据国家/地区列过滤列表。

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]

请注意,前两个列表的大小可能小于原始列表,但 is_match 将具有与原始列表相同的大小和顺序。

要将布尔值添加到完整数据集:

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')]      

推荐阅读