【问题标题】:Python : Deleting next items based on sum of previous item in list of tuplesPython:根据元组列表中前一项的总和删除下一项
【发布时间】:2019-02-28 17:56:03
【问题描述】:

我有三个元组输入列表示例:

bc_lst = [(639, 16), (653, 25), (734, 33), (768, 50), (777, 16), (827, 42), (854, 24), (867, 63), (869, 48), (877, 26), (903, 26), (927, 26), (929, 22), (949, 20), (969, 20), (990, 19), (999, 23), (1010, 19), (1030, 20), (1042, 63), (1049, 20), (1069, 17), (1143, 18), (1158, 18), (1174, 25)]

uc_lst = [(1215, 25), (1293, 25), (1317, 29), (1327, 43), (1346, 26), (1374, 26), (1400, 21), (1420, 21), (1430, 102), (1443, 20), (1465, 19), (1486, 20), (1506, 21), (1528, 20), (1549, 20), (1570, 20), (1591, 20), (1612, 16), (1621, 26), (1632, 21), (1639, 26), (1653, 21)]

dt_lst = [(1566, 39), (1609, 24), (1620, 20), (1650, 38), (1658, 20), (1691, 37), (1701, 20), (1732, 38), (1772, 16), (1785, 19), (1814, 36), (1854, 37), (1854, 38), (1861, 19)]

和一个缓冲区变量buf = 5。我想对bc_lstuc_lstdt_lst 执行此操作:从第一项检查,如果元组的总和小于下一个元组的第一个元素和缓冲区的总和,则删除列表中的下一项并检查下一个列表项。

考虑bc_lst。第一个元组的和是655653+5 > 655,所以我们保留(653,25)。现在检查是否734 +5 > 653+25,即True,所以保留(734,33)。现在检查768 +5 > 734+33,它又是True,所以我们检查下一项但777 +5 > 768+50False,所以我们删除元组(777,16)。现在我们再次检查827+5 > 768+50 是否为True,所以我们保留(827,42)。这个过程还在继续。

这是我试过的代码:

def func1(a1):
    count = 0
    while count < len(a1)-1:
        if a1[count+1][0] + buf < sum(a1[count]):
            del a1[count+1]
        count +=1
func1(bc_lst)

我得到的 bc_lst 输出是:

[(639, 16), (653, 25), (734, 33), (768, 50), (827, 42), (867, 63), (877, 26), (903, 26), (927, 26), (949, 20), (969, 20), (990, 19), (1010, 19), (1030, 20), (1049, 20), (1069, 17), (1143, 18), (1158, 18), (1174, 25)]

,对于 uc_lst,输出为:

[(1215, 25), (1293, 25), (1317, 29), (1346, 26), (1374, 26), (1400, 21), (1420, 21), (1443, 20), (1465, 19), (1486, 20), (1506, 21), (1528, 20), (1549, 20), (1570, 20), (1591, 20), (1612, 16), (1632, 21), (1653, 21)]

,对于 dt_lst,输出为:

[(1566, 39), (1609, 24), (1650, 38), (1691, 37), (1732, 38), (1772, 16), (1785, 19), (1814, 36), (1854, 37), (1861, 19)]

bc_lst 的期望输出是:

[(639, 16), (653, 25), (734, 33), (768, 50), (827, 42), (867, 63), (927, 26), (949, 20), (969, 20), (990, 19), (1010, 19), (1030, 20), (1049, 20), (1069, 17), (1143, 18), (1158, 18), (1174, 25)]

uc_lst 的期望输出与我得到的输出相同,dt_lst 的期望输出是:

[(1566, 39), (1609, 24), (1650, 38), (1691, 37), (1732, 38), (1772, 16), (1814, 36), (1854, 37)]

代码有什么问题?

【问题讨论】:

  • itertools.compress 可能是你想要的
  • @Aemyl 这不是重复的,我的问题在迭代列表时从列表中删除项目背后的逻辑是不同的。
  • itertools.compress 应该仍然可以在这里工作。我应该写一个例子作为答案吗?
  • 好的,我想 Mike Robins 已经很好地回答了这个问题,并且表明这里不需要 itertools

标签: python python-3.x list tuples


【解决方案1】:

我认为问题在于,如果您删除一个项目,您不想增加计数。

buf=5

def func1(a1):
    count = 0
    while count < len(a1) - 1:
        if a1[count + 1][0] + buf < sum(a1[count]):
            del a1[count + 1]
        else:
            count += 1

【讨论】:

    【解决方案2】:

    要保存中间结果,您可以逐个处理元素。

    例如,您将有一个函数,其输入为您要处理的列表、缓冲和当前处理元素索引,如下所示:

    def process_list_element(list, current_index, buffer):
        if list[current_index + 1][0] + buf < sum(list[current_index]):
            del list[current_index+ 1]
        else:
            current_index += 1
        return list, current_index
    

    * 请仔细看,因为它只是演示方法的伪代码

    然后重复

    index = 0
    buffer = 5
    while index < len(list) -1:
        list, index = process_list_element(list, index, buffer)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-09
      • 2019-07-25
      • 1970-01-01
      • 2017-12-17
      • 2018-12-01
      • 2016-09-25
      • 1970-01-01
      • 2018-09-14
      相关资源
      最近更新 更多