【问题标题】:Python sum values in list of tuples up to certain valuesPython 将元组列表中的值求和到某些值
【发布时间】:2017-10-21 23:31:42
【问题描述】:

注意:我编辑了问题!

我在 Python 中的迭代遇到了麻烦,尤其是当我想对某个数值进行汇总时。以下是有关我面临的问题的更多信息:

我有一个如下所示的元组列表:

[(1, 0.5, 'min'),
 (2, 3, 'NA'),
 (3, 6, 'NA'),
 (4, 40, 'NA'),
 (5, 90, 'NA'),
 (6, 130.8, 'max'),
 (7, 129, 'NA'),
 (8, 111, 'NA'),
 (9, 8, 'NA'),
 (10, 9, 'NA'),
 (11, 0.01, 'min'),
 (12, 9, 'NA'),
 (13, 40, 'NA'),
 (14, 90, 'NA'),
 (15, 130.1, 'max'),
 (16, 112, 'NA'),
 (17, 108, 'NA'),
 (18, 90, 'NA'),
 (19, 77, 'NA'),
 (20, 68, 'NA'),
 (21, 0.9, 'min'),
 (22, 8, 'NA'),
 (23, 40, 'NA'),
 (24, 90, 'NA'),
 (25, 92, 'NA'),
 (26, 130.4, 'max')]

我想将导致“max”的每个值和导致“min”的每个值相加,并将这些结果附加到两个单独的列表中。

例如,输出应该是:

min_sums = [1+2+3+4+5,11+12+13+14, 21+22+23+24+15]
max_sums = [6+7+8+9+10, 15+16+17+18+19+20, 26]

我还想跟踪我实际总结的值并将其作为输出:

min_sums_lst = [[1,2,3,4,5], [11,12,13,14],[21,22,23,24,15]]
max_sums_lst = [[6,7,8,9,10], [15,16,17,18,19,20], [26]]

我想我可以使用索引值,但对 Python 来说还是很陌生,并且不完全确定如何继续。我正在学习生物学,但我相信学习 CS 会对我的工作有所帮助。

max_list = []
min_list = []
flag = ''
min_index = 0
max_index = float('inf');

if flag == 'h':
    max_list.append(item)
elif flag == 'c':
    min_list.append(item)

for i, item in enumerate(minmax_list):
    print(i, item)
    print("max_index: ", max_index)
    print("min_index: ", min_index)
    if item[2] == 'min':
         min_index = i
         max_list('h', item[0])
    elif item[2] == 'NA' and (i < max_index):
        max_list('h', item[0])
    elif item[2] == 'max':
         max_index = i
         max_list('c', item[0])
    elif item[2] == 'NA' and (i > min_index):
        min_list('c', item[0])

我对 Python 很陌生 - 任何帮助都将不胜感激。我只是尝试根据上面输出中所示的最小值和最大值在每个元组中添加第一项。

【问题讨论】:

  • 我仍然在如何跟踪我实际总结的值方面遇到问题,所以如果有人能补充一下如何获得 min_sums_lst 和 max_sums_lst,那将有很大帮助!

标签: python list tuples intervals object-slicing


【解决方案1】:

我的回答与@Stefan 的做法略有不同。它做了更多的验证,你可以很容易地添加除 'min' 和 'max' 之外的其他类型。

def partition_items(items):
    lists = {
        'min': [],
        'max': [],
    }
    current_kind = None
    current_list = None
    for value, _, kind in items:
        if kind != current_kind and kind != 'NA':
            current_kind = kind
            # You'll get a error here if current_kind isn't one of 'min'
            # or 'max'.
            current_list = lists[current_kind]
            current_list.append(0)
        # You'll get an error here if the first item in the list doesn't
        # have type of 'min' or 'max'.
        current_list[-1] += value
    return lists


lists = partition_items(items)
print(lists['min'])
# -> [15, 50, 115]
print(lists['max'])
# -> [40, 105, 26]

【讨论】:

    【解决方案2】:

    抱歉,没仔细看你的尝试,看起来很复杂。

    min_sums = []
    max_sums = []
    for x, _, what in minmax_list:
        if what != 'NA':
            current = min_sums if what == 'min' else max_sums
            current.append(0)
        current[-1] += x
    

    【讨论】:

    • 感谢您的回答 - 这似乎是正确的,但我正在尝试扩展它并更了解您的策略!
    猜你喜欢
    • 2023-03-31
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2015-07-14
    相关资源
    最近更新 更多