我正在编写一个函数,用于获取每年购买的软件许可证&返回每个月花费的金额。所以投入。
#[company id, user id, purchase amount, date in yy-mm format, day when customer first registered]
['55463', '114769', $200, '14-5', '2/14/2013']会回来
['55463', '114769', $17.5, '14-5', '2/14/2013']
['55463', '114769', $17.5, '14-6', '2/14/2013']
['55463', '114769', $17.5, '14-7', '2/14/2013']
['55463', '114769', $17.5, '14-8', '2/14/2013']等等,我有一个函数,可以按需要打印出来。但是,当我试图访问函数外部的数据时,我写入的数组在上个月突然显示了多次重复。所以最后一个例子就是。
['55463', '114769', $17.5, '14-8', '2/14/2013']
['55463', '114769', $17.5, '14-8', '2/14/2013']
['55463', '114769', $17.5, '14-8', '2/14/2013']
['55463', '114769', $17.5, '14-8', '2/14/2013']我不知道这是为了我的生命&我会非常感谢任何帮助。这是我的密码。我相信错误在for循环中的某个位置,在范围(11)中的x开始。谢谢你的帮助!
line_items = []
annualized = []
def csv_dict_reader(file_obj):
global board_info
reader = csv.DictReader(file_obj, delimiter=',')
for line in reader:
item = []
item.append(line["company id"])
item.append(line["user id"])
item.append(line["Amount"])
item.append(line["Transaction Date"])
item.append(line["FIrst Transaction"])
line_items.append(item)
if __name__ == "__main__":
with open("ChurnTest.csv") as f_obj:
csv_dict_reader(f_obj)
def dateSplit():
for i in range(1,4192):
line = line_items[i]
amount = line_items[i][2]
if len(amount) > 1 and line_items[i][1] == '114769':
if float(amount) > 150:
line_items[i][2] = float(amount) / 12
#monthly_transactions.append(line_items[i])
year = int(line[3][:2])
month = int(line[3][4:])
for x in range(11):
month = int(month)
year = int(year)
newLine = line_items[i]
if month > 11:
year = year + 1
month = 1
else:
month = month + 1
newLine[3] = str(year) + "-" + str(month)
annualized.append(newLine)
#This prints out the data as I want it to be
print(annualized[len(annualized)-1])
else:
monthly_transactions.append(line_items[i])
dateSplit()
#This prints out the data incorrectly.
print(annualized)发布于 2014-06-25 21:51:47
关于错误的来源,您是正确的,它在循环for x in range(11):中。这一行:
newLine = line_items[i]不创建一个新对象。Python列表是可变的,所以即使您编辑了它,newLine仍然引用annualized和line_items中相同的对象。最小的解决办法是:
newLine = line_items[i][:] # or 'line[:]' - see below这使得newLine在每个循环中都是一个单独的副本。
有关名称和参考的更多信息,您可能应该阅读这和这。
为什么分配line然后继续引用line_items[i]?而且,硬代码4192看起来真的很奇怪;您可以不做for line in line_items[1:]:吗?
https://stackoverflow.com/questions/24419091
复制相似问题