【发布时间】: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_lst、uc_lst 和dt_lst 执行此操作:从第一项检查,如果元组的总和小于下一个元组的第一个元素和缓冲区的总和,则删除列表中的下一项并检查下一个列表项。
考虑bc_lst。第一个元组的和是655 和653+5 > 655,所以我们保留(653,25)。现在检查是否734 +5 > 653+25,即True,所以保留(734,33)。现在检查768 +5 > 734+33,它又是True,所以我们检查下一项但777 +5 > 768+50 是False,所以我们删除元组(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