比较列表中的列

时间:2018-07-19 20:01:07

标签: python python-3.x

我已经完成了对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 个答案:

答案 0 :(得分:2)

您要基于“国家/地区”列过滤列表。

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

答案 1 :(得分:1)

您要使用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

答案 2 :(得分:1)

只需遍历所有电影并比较第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'

答案 3 :(得分:1)

您可能正在寻找一种不带任何第三方库(即仅标准库)的通用解决方案。我们开始:

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