Python 2.7列表操作列表列表

Python 2.7列表操作列表列表,python,list,loops,python-2.7,Python,List,Loops,Python 2.7,我不熟悉Python 2.7。下面是我的数据的一个子集,它只是一个列表列表,希望将具有相同类型(myList[0])和相同日期(myList[8])的列表的值相加到一个新的单列表中 myList = [ [u'MtM', u'Consistency Check', u'Break', 123123, 123, 456456, 456, '1/8/2014'], [u'MtM', u'Consistency Check', u'Break', 321321, 321, 654654

我不熟悉Python 2.7。下面是我的数据的一个子集,它只是一个列表列表,希望将具有相同类型(
myList[0]
)和相同日期(
myList[8]
)的列表的值相加到一个新的单列表中

myList = [
    [u'MtM', u'Consistency Check', u'Break', 123123, 123, 456456, 456, '1/8/2014'],
    [u'MtM', u'Consistency Check', u'Break', 321321, 321, 654654, 654, '1/8/2014'],
    [u'MtM', u'Consistency Check', u'Break', 987987, 987, 789789, 789, '1/9/2014'],
    [u'Notional', u'Consistency Check', u'Break', 320320, 320, 210210, 210, '1/13/2014'],
    [u'Notional', u'Completeness Check', u'Break', 121121, 121, 412412, 412, '1/13/2014']
]
我试图得到以下结果,但不知道如何做到:

newList = [
    [u'MtM', u'Consistency Check', u'Break', 444444, 444, 1111110, 1110, '1/8/2014'],
    [u'MtM', u'Consistency Check', u'Break', 987987, 987, 789789, 789, '1/9/2014'],
    [u'MtM', u'Consistency Check', u'Break', 320320, 320, 210210, 210, '1/13/2014'],
    [u'Notional', u'Consistency Check:Completeness Check', u'Break', 441441, 441, 622622, 622, '1/13/2014']
]
在新列表(
newList
)中,具有相同类型的相同日期的列表被合并到一个列表中,但其数值相加,并且描述项(
myList[1]
)值与
“:”
串联


有人知道怎么做吗?如有任何想法或建议,将不胜感激。谢谢大家!

使用字典将条目映射到公共和:

sums = {}
for entry in myList:
    key = entry[0], entry[-1]
    if key not in sums:
        sums[key] = entry[:]
        sums[key][1] = set([entry[1]])
    else:
        sums[key][3:-1] = [s + elem for s, elem in zip(sums[key][3:-1], entry[3:-1])]
        sums[key][1].add(entry[1])

newList = [e[:1] + [':'.join(e[1])] + e[2:] for e in sums.values()]
  • 项目在第一个和最后一个元素上分组
  • 除前3列和最后一列外,其他所有列都被求和
  • 输出顺序可以是任意的
  • 第三列(
    u'Break'
    )没有变化
  • 演示:


    使用字典将条目映射到公共和:

    sums = {}
    for entry in myList:
        key = entry[0], entry[-1]
        if key not in sums:
            sums[key] = entry[:]
            sums[key][1] = set([entry[1]])
        else:
            sums[key][3:-1] = [s + elem for s, elem in zip(sums[key][3:-1], entry[3:-1])]
            sums[key][1].add(entry[1])
    
    newList = [e[:1] + [':'.join(e[1])] + e[2:] for e in sums.values()]
    
  • 项目在第一个和最后一个元素上分组
  • 除前3列和最后一列外,其他所有列都被求和
  • 输出顺序可以是任意的
  • 第三列(
    u'Break'
    )没有变化
  • 演示:



    我有一个想法:
    itertools.groupby()
    ()@newtover:当数据还没有排序时,这就没有那么有效了。@martijnpoters对于一个在未排序的列表上工作的
    groupby
    优化函数,我不会给出什么建议。@AdamSmith:它被称为字典…:-p输出示例与实际输入不匹配。例如,没有
    'MtM',1/13/2014'
    对。我有一个想法:
    itertools.groupby()
    ()@newtover:当数据还没有排序时,这不是那么有效。@martijnpiers我不会为
    groupby
    的优化函数提供什么,它可以在未排序的列表上工作。@AdamSmith:它被称为字典…:-p输出示例与实际输入不匹配。例如,没有
    'MtM',1/13/2014'
    对。如果myList的条目长度未知,该怎么办?@felipsmartins:这将以任何有限长度
    myList
    作为输入;最后一个元素假定为日期,前三个元素不求和。@felipsmartins:如果您的长度在整个数据序列中变化,则需要使用填充值为
    0的
    itertools.izip_longest()
    ,而不是纯
    zip()
    ;按照切片分配的工作方式,将在
    sums
    @felipsmartins:中动态增加求和的条目。抱歉,上一次迭代将第一个条目求和两次。现在已修复。如果myList的长度未知,代码将如何更改?将zip()替换为itertools.izip.longest()后,是否只需要更改参数值“fillvalue=0”?非常感谢。如果myList的条目长度未知怎么办?@felipsmartins:这将以任何有限长度
    myList
    作为输入;最后一个元素假定为日期,前三个元素不求和。@felipsmartins:如果您的长度在整个数据序列中变化,则需要使用填充值为
    0的
    itertools.izip_longest()
    ,而不是纯
    zip()
    ;按照切片分配的工作方式,将在
    sums
    @felipsmartins:中动态增加求和的条目。抱歉,上一次迭代将第一个条目求和两次。现在已修复。如果myList的长度未知,代码将如何更改?将zip()替换为itertools.izip.longest()后,是否只需要更改参数值“fillvalue=0”?非常感谢。