试图遍历附加到变量类(?)下对象的列表

2024-06-16 11:30:25 发布

您现在位置:Python中文网/ 问答频道 /正文

完整代码在末尾。你知道吗

我写了一个程序,从csv文件中读取数据。它创建了一个名为“Facility”的变量类。每个设施可以有多个水源,因此还有另一个类称为“WaterSource”,它将单个水源的属性列表附加到每个设施中。如果我打电话: data['00312']

我得到输出:

Facility 00312 US Aggregates Inc IN

如果我要求data['00312'].records

[ WaterSource 00312 WELL Willshire 80  683175 4511625,
WaterSource 00312 WELL Willshire 80  682550 4511750,
WaterSource 00312 INTAKE Willshire 1200 Unnamed Quarry 683225 4512075,
WaterSource 00312 INTAKE Willshire 1200 Unnamed Quarry 683225 4512050]

我需要创建一个报告,该报告迭代类中的每个变量,并返回具有多个水源的设施列表。因此,最终输出将是一个[RegNo,设施名称,水源编号]列表,例如:

【设施00312美国骨料公司4】

我遇到的问题是理解如何遍历设施来计算附加到每个设施对象的水源的记录。我想我可以在某个地方给类添加一个方法,但我不太清楚在哪里。我是一个python初学者,所以请原谅我,如果这是不太正确的词汇。我甚至不知道从哪里开始,所以你能提供的任何建议都会很有帮助。你知道吗

class Facilities:

    def __init__(self, regno, name, mwu):  ##creates facility attributes
        self.regno = regno
        self.name = name
        self.mwu = mwu
        self.records = []

    def add_record(self,record):
        self.records.append(record)

    def __repr__(self):
        '''Makes a string representation'''
        return 'Facility {0} {1} {2}'.format(self.regno, self.name, self.mwu)

class WaterSource(Facility):
    '''holds info about the water source'''
    def __init__(self, regno, source, quad, cap, body, utmE, utmN):  ##creates water source attributes 
        self.regno = regno
        self.source = source
        self.quad = quad
        self.cap = cap
        self.body = body
        self.utmE = utmE
        self.utmN = utmN
        self.records = []

    def source_data(self):
        regnos = []
        sources = []
        quads = []
        caps = [] 
        bodies = []
        utmEs = []
        utmNs = []
        for record in self.records:
            regnos.append(record.regno)
            sources.append(record.source)
            quads.append(record.quad)
            caps.append(record.cap)
            bodies.append(record.body)
            utmEs.append(record.utmE)
            utmNs.append(record.utmN)
        return (regnos,sources,quads,caps,bodies,utmEs,utmNs)

    def __repr__(self):
        return ' WaterSource {0} {1} {2} {3} {4} {5} {6}'.format(self.regno, \
                                        self.source, self.quad, self.cap, self.body, self.utmE, self.utmN)

def read_data(filename):
    rv = {}
    for r in csv.DictReader(open(filename, 'r', encoding='UTF-8')):
        regno = r['RegNo']
        if r['RegNo'] not in rv:
            rv[regno] = Facilities(r['RegNo'],r['Facility'], r['MWU Code'])
        rv[regno].add_record(WaterSource(regno, r['Source Code'], r['Quadrangle'], \
                                    r['Capacity (GPM)'], r['Water Body Name'], r['UTM East'], r['UTM North']))

    return rv
data = read_data('Fac-2013-2016.csv')

Tags: selfsourcedatadefbodyrecordcaprecords
2条回答

所有的工具都以值的形式存储在字典data中,使用工具的RegNo作为键。可以使用dictionary items method遍历所有数据。每个设施的records属性的长度是水源的数量。您可以构建一个格式字符串来使用所需的信息。你知道吗

for reg_no, facility in data.items():
    no_of_sources = len(facility.records)
    print(f'Facility {facility.regno} {facility.name} {no_of_sources}')    #Python v3.6+
    #print('Facility {} {} {}'.format(facility.regno, facility.name, no_of_sources))    #Python versions <3.6

[Facility 00312 US Aggregates Inc 4]

The issue I'm having is understanding how to iterate over the Facilities to count the records of the water sources appended to each Facilities object.

根据我的理解,只需添加一个方法并返回一个对象计数,或者使用len直接向上计数记录,除非您要求的内容有更多内容?你知道吗

class Facilities:
  def __init__(self, regno, name, mwu):  ##creates facility attributes
      self.regno = regno
      self.name = name
      self.mwu = mwu
      self.records = []

  def add_record(self,record):
      self.records.append(record)

  def __repr__(self):
      '''Makes a string representation'''
      return 'Facility {0} {1} {2} {3}'.format(self.regno, self.name, self.mwu , len(self.records))

相关问题 更多 >