1

我有两个列表ref_listdata_list每个列表都包含一个元组,第一个元素就像第二个时间,第二个是随机值:

ref_list = [(1,value_ref_1),(3,value_ref_3),(4,value_ref_4), ... ]
data_list = [(1,value_dat_1),(2,value_dat_2),(4,value_dat_4), ... ]

我想计算第二个值的差异作为时间的函数(元组的第一个值)。这意味着,一个元组列表,其中第一个值是时间,第二个是第二个值的差异。我希望它能够管理上次使用的两个列表中的任何一个中丢失的数据!对于前面的示例,结果将是:

res_list = [(1,value_dat_1-value_ref_1),(2,value_dat_2-value_ref_1),(3,value_dat_2-value_ref_3),(4,value_dat_4-value_ref_4), ... ]

在此示例中,元组(2,value_dat_2-value_ref_1)是使用元组创建的(2,value_dat_2),因为在 中缺少(1,value_ref_1)带有 as first 的元组。同样的想法反过来2ref_list(3,value_dat_2-value_ref_3)

我无法弄清楚如何通过列表理解来做到这一点。

我希望我足够清楚。

非常感谢。

4

2 回答 2

1

编辑 1:IndexError:如果两个列表的长度相同,则不应出现索引错误。data_list[i] 将给出 data_list 的第 i 个元素,无论其内容如何。当您从 python list() 中弹出一个值时,它会“移动”索引,因此您没有索引间隙(与其他语言不同)。或者我没有很好地理解你的担心。

缺失数据:是的,是的。因此,如果缺少一个值,则需要返回多个值:上限和下限

[(elt[0],data_list[i][1]-elt[1]) if data_list[i][0]==elt[0] else ((elt[0],data_list[i][1]-ref_list[i-1][1]),(elt[0],data_list[i][1]-ref_list[i+1][1])) for i,elt in enumerate(ref_list)]

这样,如果一个值丢失,它会去搜索前一个值和下一个值,这样你就可以获得丢失值的范围。除了返回另一个结构中的“其他”元组之外,我别无选择,因为我每回合只能返回一个“值”。(或面临 SyntaxError :'for' 处的语法无效)

即使您可能需要这些元组的元组(以检测缺少值),您也可能想知道另一种解决方案 - 一个显式生成器。

def generator_stuff(data_list,ref_list):
    for i,elt in enumerate(ref_list):
        if data_list[i][0]==elt[0]:
            yield (elt[0],data_list[i][1]-elt[1])
        else:
            yield (elt[0],data_list[i][1]-ref_list[i-1][1])
            yield (elt[0],data_list[i][1]-ref_list[i+1][1])

我完全不知道它的性能,但是当它单独返回每个元组时,你不会有元组的元组。

于 2013-08-29T08:15:45.100 回答
1

另外运行以下两个列表,每个列表有 500k 值,100mb/200mb(取决于生成参数)稳定的内存使用

list_a = [(1,222),(2,444),(5,666),(10,888)]
list_b = [(1,111),(3,333),(7,555),(9,777),(10,888)]

list_c = []

i = 1
a = None
b = None


def get_new(a, for_time):
    if len(a) == 0:
        raise IndexError

    # in the future
    if a[0][0] > for_time:
        return None

    return a.pop(0)

list_a_exhausted = False
list_b_exhausted = False

while True:     
    try:
        a = get_new(list_a,i) or a
    except IndexError:
        list_a_exhausted = True

    try:
        b = get_new(list_b,i) or b  
    except IndexError:
        list_b_exhausted = True

    if list_a_exhausted and list_b_exhausted:
        break

    list_c.append([(i,b[1]-a[1])])  
    i = i + 1
于 2013-08-29T09:24:06.123 回答