将列表按值之间的增量划分为子列表

2024-09-29 02:20:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表和一个位置。 我想将a拆分为具有相似值的子列表

子列表中的每个值必须相距1或12(我可以确定这个数字,d,在本例中是1)。 因此,在本例中,新列表应为: a_divided = [[39, 40], [42, 43, 44, 45]] 然后我需要选择包含b的子列表,该子列表产生a_end = [42, 43, 44, 45]

其他例子:

a = [16, 28, 64, 76, 88]; b = 28; d = 12 
-> a_divided = [[16, 28], [64, 76, 88]] -> a_end = [16, 28]

a = [107, 108, 109, 111, 112, 113, 114, 116, 177, 118]; b = 112; d = 1 
-> a_divided = [[107, 108, 109], [111, 112, 113, 114], [116, 117, 118]] -> a_end = [111, 112, 113, 114]

我该怎么做


Tags: 列表数字例子enddivided本例
1条回答
网友
1楼 · 发布于 2024-09-29 02:20:50

您实际上不需要为此将列表拆分为所有子列表。找到b元素的位置,然后得到下面和前面的元素,直到得到每边不是1或12的差值

a = [39, 40, 42, 43, 44, 45]
b = 43

result = [b]                       # start with b in sublist
p      = a.index(b)                # position of b
for n in a[p+1:]:                  # extend forward
    if abs(n-result[-1]) in (1,12):  # check difference with last
        result.append(n)             # add eligible at end
    else: break                      # end of sublist reached
for n in reversed(a[:p]):          # extend backward
    if abs(n-result[0]) in (1,12):   # check difference with first
        result.insert(0,n)           # add eligible at begining
    else: break                      # start of sublist reached

print(result) # [42, 43, 44, 45]

如果需要将列表分解为子列表,可以使用zip()将每个元素与下一个元素进行比较,并生成一个分解索引列表(子列表将拆分的位置)。然后使用这些中断位置作为列表的下标,并形成子列表。最后找到包含b的子列表:

breaks   = [i for i,(p,n) in enumerate(zip(a,a[1:]),1) if abs(p-n) not in (1,12)]
sublists = [ a[s:e] for s,e in zip([0]+breaks,breaks+[len(a)]) ]
result   = next(sl for sl in sublists if b in sl)

print(result) # [42, 43, 44, 45]

尽管这不如第一种方法有效,但它更通用,并且可以很容易地适应于支持b中有多个a实例的情况

相关问题 更多 >