使对象可迭代?

Awf*_*mon 5 python iterable class

我试图迭代列表列表中的每一行,将每行中的一个元素附加到新列表中,然后在新列表中查找唯一元素。

我知道我可以使用 for 循环轻松完成此操作。我正在尝试不同的路线,因为我想了解有关类和函数的更多信息。

这是列表列表的示例。第一行是标题:

legislators = [
 ['last_name', 'first_name', 'birthday', 'gender', 'type', 'state', 'party'],
 ['Bassett', 'Richard', '1745-04-02', 'M', 'sen', 'DE', 'Anti-Administration'],
 ['Bland', 'Theodorick', '1742-03-21', '', 'rep', 'VA', ''],
 ['Burke', 'Aedanus', '1743-06-16', '', 'rep', 'SC', ''],
 ['Carroll', 'Daniel', '1730-07-22', 'M', 'rep', 'MD', ''],
 ['Clymer', 'George', '1739-03-16', 'M', 'rep', 'PA', ''],
 ['Contee', 'Benjamin', '', 'M', 'rep', 'MD', ''],...]
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

import csv
f = open("legislators.csv")
csvreader = csv.reader(f)
legislators = list(csvreader)

class Dataset:
    def __init__(self, data):
        self.header = data[0] #Isolate header from CSV file
        self.data = data[1:] #Subset CSV data to remove header

legislators_dataset = Dataset(legislators)

def the_set_maker(dataset):
    gender = []
    for each in dataset:
        gender.append(each[3])
    return set(gender)

t=the_set_maker(legislators_dataset)
print(t)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

legislators = [
 ['last_name', 'first_name', 'birthday', 'gender', 'type', 'state', 'party'],
 ['Bassett', 'Richard', '1745-04-02', 'M', 'sen', 'DE', 'Anti-Administration'],
 ['Bland', 'Theodorick', '1742-03-21', '', 'rep', 'VA', ''],
 ['Burke', 'Aedanus', '1743-06-16', '', 'rep', 'SC', ''],
 ['Carroll', 'Daniel', '1730-07-22', 'M', 'rep', 'MD', ''],
 ['Clymer', 'George', '1739-03-16', 'M', 'rep', 'PA', ''],
 ['Contee', 'Benjamin', '', 'M', 'rep', 'MD', ''],...]
Run Code Online (Sandbox Code Playgroud)

我认为答案是尝试创建一个def __iter__(self)在我的Dataset班级中使用的方法,但我无法让它发挥作用。这是正确的道路吗?如果没有,还有什么更好的呢?

scn*_*erd 5

根据文档__iter__

此方法应返回一个新的迭代器对象,该对象可以迭代容器中的所有对象。

您可以尝试以下类定义:

class Dataset:
    def __init__(self, data):
        self.header = data[0] #Isolate header from CSV file
        self.data = data[1:] #Subset CSV data to remove header

    def __iter__(self):
        return iter(self.data)
Run Code Online (Sandbox Code Playgroud)

如果您愿意尝试新选项,请考虑使用 Pandas:

import pandas as pd
df = pd.read_csv('legislators.csv')
t=df['gender']
Run Code Online (Sandbox Code Playgroud)

或者,如果您确实想自己阅读 CSV,

df = pd.DataFrame(legislators[1:], columns=legislators[0])
Run Code Online (Sandbox Code Playgroud)