迭代长列表的集合

时间:2013-08-06 19:53:25

标签: python list iteration

我正在迭代包含~500.000个子列表的10-20个长列表的集合。列表如下:

A = [['a', 'b', 1.7], ['d', 'e', 6.2] ...]
B = [['a', 'b', 2.0], ['d', 'e', 10.0] ...] 
C = [['a', 'b', 3.0], ['d', 'e',7.0] ...]

依旧...... 我的目标是在最后获得一个列表如下:

final = [['a', 'b', 1.7, 2.0, 3.0], ['d', 'e', 6.2, 6.2, 10.0, 7.0] ...]

我已经通过比较模板列表(例如A)和包含所有列表值(总计)的列表来使用嵌套循环:

total =[['a', 'b', 1.7], ['d', 'e', 6.2], ['a', 'b', 2.0], ['d', 'e', 10.0], ['a', 'b', 3.0], ['d', 'e',7.0]]

temp = []
for i in A:
    new = [i[0:1]]
    for j in total:
        if i[0] == j[0]:
           new.append(j[2])
    temp.append(new)

我得到的东西接近我要找的东西,除了初始字符串包含在子列表中。但这很容易解决。这种方法的问题在于考虑到列表的大小,整个过程需要花费大量时间。任何替代建议或提示缩短此程序将不胜感激。

1 个答案:

答案 0 :(得分:3)

这里的dict更合适,因为它允许您在O(1)时间内访问与任何键相关的值。

使用collections.defaultdict

>>> from collections import defaultdict
>>> total =[['a', 'b', 1.7], ['d', 'e', 6.2], ['a', 'b', 2.0], ['d', 'e', 10.0], ['a', 'b', 3.0], ['d', 'e',7.0]]
>>> dic = defaultdict(list)
>>> for item in total:
        key = tuple(item[:2])  #tuples can be used as dictionary keys
        val = item[2]
        dic[key].append(val)
...     
>>> dic
defaultdict(<type 'list'>,
{('a', 'b'): [1.7, 2.0, 3.0],
 ('d', 'e'): [6.2, 10.0, 7.0]})

使用普通dict

>>> dic = {}
>>> for item in total:
        key = tuple(item[:2])  #tuples can be used as dictionary keys
        val = item[2]
        dic.setdefault(key, []).append(val)
...     
>>> dic
{('a', 'b'): [1.7, 2.0, 3.0], ('d', 'e'): [6.2, 10.0, 7.0]}