Python 2.7列表操作列表列表
我不熟悉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
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()]
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()]
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”?非常感谢。