【问题标题】:How to get the perform a difference in each sublist of a list?如何在列表的每个子列表中获得执行差异?
【发布时间】:2020-01-05 05:15:52
【问题描述】:

我想创建一个列表,该列表将是列表的每个子列表的最后一个元素和第一个元素之间的差异。子列表是 N 个元素的子列表,所以我的最终列表中有 len(list)/K+1 元素。


这是一个小例子:

我有一个列表:[0, 10, 20, 5, 10, 30, 20, 35]。我选择每个子列表最多包含 3 个元素。我将有以下子列表[0, 10, 20], [5, 10, 30], [20, 35]

现在我在每个子列表中应用差异,得到值 20, 25, 15(因为 20-030-535-20)。

我希望结果出现在列表中,因此将[20, 25, 15] 作为最终结果。

【问题讨论】:

标签: python list


【解决方案1】:

根据问题原始版本的要求,并根据 OP 所做的编辑,我们创建一个递增序列列表,然后计算每个序列的最大值和最小值之间的差异:

def spans(data):
    sequences = [[data[0]]]

    for val in data[1:]:
        if val >= sequences[-1][-1]:
            sequences[-1].append(val)
        else:
            sequences.append([val])

    return [s[-1] -s[0] for s in sequences]

使用 OP 的数据运行示例:

data = [0, 10, 20, 5, 10, 30, 20, 35]
print(spans(data))
# [20, 25, 15]

另一个:

print(spans([2, 4, 6, 8, 9, 4, 5, -2, -1, 5, 4]))
# [7, 1, 7, 0]

【讨论】:

    【解决方案2】:

    这是一个可以帮助你的脚本。

    如果您在最后一个子列表中只有一个元素,我不知道您想如何处理这种情况。我认为该元素是此子列表的结果,但也许您想忽略最后一个子列表或结果为 0。

    说明是脚本中的cmets:

    # Initial list
    l = [0, 10, 20, 5, 10, 30, 20, 35]
    
    # Number of elements to consider in each sublist.
    STEP = 3
    
    # Get the size of the list
    length = len(l)
    
    # The result list, empty at the beginning, that will be populated by the differences
    result_list = []
    
    # Iterate through sublists of exactly STEP elements
    i = 0
    while (i+STEP-1)<length:
        result_list.append(l[i+STEP-1]-l[i])
        i += STEP
    
    # Special case for the possible little last sublist
    # No difference done and element is kept if there is only one element
    if i==length-1:
        result_list.append(l[-1])
    # Else, do the difference in the last sublist
    elif i<length-1:
        result_list.append(l[-1]-l[i])
    

    这是获取每个子列表的max-min 的脚本,正如 OP 主要询问的那样:

    l = [1,2,3,4,5,6,7,8]
    n = 3
    
    def chunks(l, n):
        """Yield successive n-sized chunks from l."""
        for i in range(0, len(l), n):
            yield l[i:i + n]
    
    # Create the sublists
    grouped_l = list(chunks(l,n))
    
    # Do the max-min on each sublists
    res = []
    for i in grouped_l:
        res.append(max(i)-min(i))
    

    【讨论】:

    • 您在此处使用的算法,虽然它与您对问题所做的编辑相匹配,但与 OP 本人的最后一次编辑相矛盾,明确指出“所以初始列表需要分成组递增数字的
    • @ThierryLathuille 我认为这不是 OP 想要的,他的句子不正确,因为否则你不能得到与他在他的例子中得到的结果相同的结果(或者我错过了一些东西) .实际上,OP 所说的增量似乎是子列表。
    • OP 的最后编辑与他的示例清晰一致:[0, 10, 20, 5, 10, 30, 20, 35] 包含递增序列 [0, 10, 20][5, 10, 30][20, 35],每个的最大值和最小值之间的差异是20、25 和 15。作为旁注,您的编辑应该已被拒绝,因为它偏离了问题的初衷。
    • @ThierryLathuille 我已经更新了两个版本:一个用于 OP 首先提出的问题,一个用于问题的实际版本
    • 完全一样,写法不同。关键是:子序列不是固定长度(3),它们是递增的子序列。在[2, 4, 6, 8, 9, 4, 5, -2, -1, 5, 4] 中,它们将是[2, 4, 6, 8, 9], [4, 5], [-2, -1, 5], [4]
    猜你喜欢
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 2021-09-02
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多