【发布时间】:2018-01-23 19:08:09
【问题描述】:
我正在尝试遍历列表列表中的每一行,将每一行中的一个元素附加到一个新列表中,然后在新列表中找到唯一的元素。
我知道我可以使用 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', ''],...]
这是我的代码:
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)
我收到以下错误:
TypeErrorTraceback (most recent call last)
<ipython-input-1-d65cb459931b> in <module>()
20 return set(gender)
21
---> 22 t=the_set_maker(legislators_dataset)
23 print(t)
<ipython-input-1-d65cb459931b> in the_set_maker(dataset)
16 def the_set_maker(dataset):
17 gender = []
---> 18 for each in dataset:
19 gender.append(each[3])
20 return set(gender)
TypeError: 'Dataset' object is not iterable
我认为答案是尝试在我的 Dataset 类中使用 def __iter__(self) 创建一个方法,但我无法让它工作。这是正确的轨道吗?如果没有,有什么更好的?
【问题讨论】:
-
要使一个对象iterable,它需要实现
__iter__,它必须返回一个iterator,即实现@987654327的对象@ 和__next__。迭代器__iter__方法应该简单地返回self。 -
@juanpa.arrivillaga 谢谢。我将研究下一个。你能演示如何在我的代码中使用 next 和 iter 吗?
-
我不相信这是一个副本。您用“什么是可迭代的”回答了“我如何使我的类可迭代”,这需要至少一两个逻辑跳转来实现。我已经重新打开了。
-
您应该能够通过将您的 iter 方法定义为 return iter(self.data) 来获得您正在寻找的行为。或者,看看用你的 CSV 文件(或列表对象)制作一个 Pandas DataFrame,然后按名称引用该列
-
顺便说一句,你可以做
self.header, *self.data = data...