python 如何将列表中的项目追加到列表中的特定列表之前?

4c8rllxm  于 2022-11-21  发布在  Python
关注(0)|答案(1)|浏览(133)

我试图得到list_a的子集,其中列表b和列表c的总和最大,并且小于或等于阈值。(列表b和列表c对应于列表a)
比如说
list_a = [1, 2, 3, 4, 5]
list_b = [3,4,7,8,2]
list_c = [4,6,1,5,8]
Threshold = 12
如果列表b和列表c的值之和小于或等于阈值,那么列表b必须小于或等于阈值,而列表c必须小于或等于阈值。我不知道如何才能用最少的计算时间得到这个结果。
通过下面的函数,我试图创建子集,最终,我想得到一个列表,其中只有列表b和列表c的总和低于阈值的子集。
例如,子集(1,2)具有7作为列表B (3+4) 的值,并且列表C具有值10(4+6)。
我尝试了以下方法来创建子集:

def powerset(s):
    if s:
        tail1 = s[1:]
        for e in chain.from_iterable(combinations(tail1, r) for r in range(len(tail1) + 1, -1, -1)):
            yield (s[0],) + e
hts6caw3

hts6caw31#

下面是我的方法(也许还不完全完整,因为我对你的目标并不十分清楚):

list_a = [1, 2, 3, 4, 5]
list_b = [3,4,7,8,2]
list_c = [4,6,1,5,8]
Threshold = 12

l = len(list_a)

def total(n):
    # convert n to binary form with l digits
    mask = bin(n)[2:].zfill(l)
    # calculates and returns the corresponding sums from list_b and list_c
    return(sum(int(mask[i])*list_b[i] for i in range(l)),sum(int(mask[i])*list_c[i] for i in range(l)))

dic = {n:total(n) for n in range(2**l-1) if max(total(n)) <= Threshold}

print(dic)

# {0: (0, 0), 1: (2, 8), 2: (8, 5), 4: (7, 1), 5: (9, 9), 8: (4, 6), 10: (12, 11), 12: (11, 7), 16: (3, 4), 17: (5, 12), 18: (11, 9), 20: (10, 5), 24: (7, 10)}

此字典的键是与子集对应的整数(例如:24是二进制的11000,其对应于list_a)的{1,2}子集,并且值是来自list_b和list_c的对应和。
现在,如果你想要的只是list_a的相关子集,这个函数将打印它们(使用与total(n)函数相同的方法):

print([{list_a[i] for i in range(l) if int(bin(n)[2:].zfill(l)[i])} for n in dic])
# [set(), {5}, {4}, {3}, {3, 5}, {2}, {2, 4}, {2, 3}, {1}, {1, 5}, {1, 4}, {1, 3}, {1, 2}]

相关问题