如何从Python列表的不同行添加对象?

如何从Python列表的不同行添加对象?,python,Python,我对编程和Python都是新手,我正在编写一个修改列表的脚本。下面的第一部分显示了从文件导入后的列表 如果行具有相同的[0][2][3],我希望对每行的[4]和每行的[6]求和。同时将[2]更改为“总和” 最后一节显示了最终结果,但是在Excel中完成了我想要的操作之后,导入了文件 提前感谢你为我指明了正确的方向 ['4/1/2014', 'One', 'Buy', 'X', '33.333', '1.5', '50\n'] ['4/1/2014', 'One', 'Buy', 'y', '14

我对编程和Python都是新手,我正在编写一个修改列表的脚本。下面的第一部分显示了从文件导入后的列表

如果行具有相同的[0][2][3],我希望对每行的[4]和每行的[6]求和。同时将[2]更改为“总和”

最后一节显示了最终结果,但是在Excel中完成了我想要的操作之后,导入了文件

提前感谢你为我指明了正确的方向

['4/1/2014', 'One', 'Buy', 'X', '33.333', '1.5', '50\n']
['4/1/2014', 'One', 'Buy', 'y', '14.348', '2.3', '33\n']
['3/27/2014', 'One', 'Buy', 'Z', '18.889', '0.9', '17\n']
['4/1/2014', 'Two', 'Buy', 'X', '6.667', '1.5', '10\n']
['3/27/2014', 'Four', 'Sell', 'Z', '2.222', '0.9', '2\n']
['3/27/2014', 'One', 'Buy', 'Z', '18.889', '0.9', '17\n']
['3/27/2014', 'Two', 'Buy', 'Z', '5.556', '0.9', '5\n']
['3/27/2014', 'Three', 'Buy', 'Z', '8.889', '0.9', '8\n']
['4/1/2014', 'Four', 'Sell', 'X', '16.667', '1.5', '25\n']
['4/1/2014', 'Four', 'Sell', 'y', '3.043', '2.3', '7\n']
['4/1/2014', 'One', 'Buy', 'X', '33.333', '1.5', '50\n']
['4/1/2014', 'Two', 'Buy', 'X', '6.667', '1.5', '10\n']
['4/1/2014', 'Three', 'Buy', 'X', '3.333', '1.5', '5\n']
['4/1/2014', 'One', 'Buy', 'y', '14.348', '2.3', '33\n']
['4/1/2014', 'Two', 'Buy', 'y', '11.739', '2.3', '27\n']
['4/1/2014', 'Three', 'Buy', 'y', '1.522', '2.3', '3.5\n']



['3/27/2014', 'Four', 'Sell', 'Z', '2.222', '0.9', '2\n']
['4/1/2014', 'Four', 'Sell', 'X', '16.667', '1.5', '25\n']
['4/1/2014', 'Four', 'Sell', 'y', '3.043', '2.3', '7\n']
['3/27/2014', 'Sum', 'Buy', 'Z', '33.333', '0.9', '30\n']
['4/1/2014', 'Sum', 'Buy', 'X', '43.333', '1.5', '65\n']
['4/1/2014', 'Sum', 'Buy', 'y', '27.609', '2.3', '63.5\n']

因此,经过多次尝试,我终于取得了成功:

首先,您需要删除输入中的重复数据(因为您的结果似乎没有考虑重复数据):

然后您创建一个包含输出的列表,对于列表中的每个项目,我们将其弹出(从列表中删除并储存),然后将其与其他项目进行比较,以确定是否必须将其相加。如果是这样,我们求和并删除它们,这样它们就不会再次求和

out = []

while len(li):
    tmp = li.pop(0)
    i = 0
    while i < len(li):
        item = li[i]
        if tmp[0] == item[0] and tmp[2] == item[2] and tmp[3] == item[3]:
            tmp[1] = 'Sum'
            tmp[4] = '{:.3f}'.format((float(tmp[4]) + float(item[4])))
            tmp[6] = '{:.1f}\n'.format(float(tmp[6]) + float(item[6]))
            li.pop(i)
        else:
            i += 1
    out.append(tmp)
out=[]
而len(li):
tmp=li.pop(0)
i=0
而我

很抱歉直接给出答案,而不是指导您。您是否考虑过使用数据库?行的顺序是否重要?你希望结果保持不变还是可以改变?您需要将[2]替换为Sum还是希望使用Sum创建新行?我已经到了可以导入文件、更改对象、对其排序、创建列表、根据各种对象的内容附加到列表以及将列表写入文件的阶段。我已经为上述挑战寻找了解决方案,但需要一些研究方向。谢谢。谢谢Jan,一个带有[2]和的新行和求和值就可以了,我可以把它附加到最后的列表中。订单可能不重要,因为我可以稍后再排序。谢谢你,这很有效。现在我的作业是理解它:)非常感谢,我会尝试一下:)例如,
返回any(a!=b代表a,b在zip(l1,l2)中)
将是一个很好的实现
is_duplicate
(或者在Python 2.x上的
itertools.izip
,如果性能重要的话):
例如,如果调用
is\u duplicate
,除非我弄错了。同一块中的j的内部
可以被li[I+1:
中的x的
替换,除非我弄错了。@ErikAllik您的is\u duplicate实现是错误的,您必须将其反转,才能使其像在
中一样工作,而不返回任何值(a!=b表示a,b在zip(l1,l2)中),修改答案
out = []

while len(li):
    tmp = li.pop(0)
    i = 0
    while i < len(li):
        item = li[i]
        if tmp[0] == item[0] and tmp[2] == item[2] and tmp[3] == item[3]:
            tmp[1] = 'Sum'
            tmp[4] = '{:.3f}'.format((float(tmp[4]) + float(item[4])))
            tmp[6] = '{:.1f}\n'.format(float(tmp[6]) + float(item[6]))
            li.pop(i)
        else:
            i += 1
    out.append(tmp)