首页 > 解决方案 > 循环以一次添加一行到列表

问题描述

我有下面的代码来创建 ItemID 的列表和其他从 csv 创建其他列表的功能。我尝试编写一个函数来循环并一次添加一行到其他列表(为每个 ItemID 添加一个新的价格行),而不是每个循环都创建完整列表。

def Main(filename1, filename2):
    with open(filename1, "r") as csv1, open(filename2, "r") as csv2:  
        csvReader1 = csv.DictReader(csv1)
        csvReader2 = csv.DictReader(csv2)

        ItemIDList = []
        for row1, row2 in zip(csvReader1, csvReader2):  
          ItemIDList.append((row2["ItemId"]))
    return ItemIDList

def buildObject(ItemIDList):

    for row in ItemIDList: getPrice(filename1, filename2)
    for row in ItemIDList: NameList = getName(filename1, filename2)

def getPrice(filename1, filename2):
    with open(filename1, "r") as csv1, open(filename2, "r") as csv2:  
        csvReader1 = csv.DictReader(csv1)
        csvReader2 = csv.DictReader(csv2)

        priceList = []
        for row1, row2 in zip(csvReader1, csvReader2):  
          csvPVList.append((row2["Price"]))
        return priceList

主要构建 ID 列表,getPrice 是我试图重写的函数,以便在 buildObject 中的每个循环一次只从 csv 中添加一行。

标签: pythonlistcsv

解决方案


这是一个设计问题。从磁盘读取文件是一项昂贵的操作,应该只执行一次。并且将两个 csv 文件加载到内存中以压缩它们的内存效率不高。所以你应该:

  • 有一个提取器方法/函数,一次读取两个文件,并提供列表(或元组/命名元组/对象的列表)以及接下来将使用的所有数据
  • 让这个提取器返回这些列表

如果使用单独的列表,代码可以是(高度简化,无错误处理):

def extract_data(filename1, filename2):
    with open(filename1, "r") as csv1, open(filename2, "r") as csv2:  
        csvReader1 = csv.DictReader(csv1)
        csvReader2 = csv.DictReader(csv2)

        ItemIDList = []
        priceList = []
        for row1 in csvReader1:
            row2 = next(csvReader2)
            ItemIDList.append(row2["ItemId"])
            priceList.append(row2["Price"])
            ...                                    # eventually extract other fields
    return ItemIDList, priceList

或者如果使用命名元组:

from collections import namedtuple
Record = namedtuple("ItemId", "Price")
...
            recordList = []
            for row1 in csvReader1:
                row2 = next(csvReader2)
                recordList.append(Record(row2["ItemId"],row2["Price"]))
        return recordList

推荐阅读