首页 > 解决方案 > 使用 for 循环进行列表绑定

问题描述

我正在使用列表进行产品捆绑。这是列表:

list_id_category = ['c1','c2','c3','c4','c5','c6','c7','c8','c9','c10']

这是我需要的条件:

  1. 每个捆绑包含 3 个产品(例如:c1-c2-c3)
  2. 捆绑中不能只有一种类别(例如:c1-c1-c1 => 不允许)
  3. 每个捆绑可能有 2 个相同的类别(例如:c1-c1-c2)
  4. 每个捆绑的顺序没有区别(例如:c1-c2-c3 = c1-c3-c2 很快)

这是我的代码:

bundling_list = []
for i in list_id_category:
catefory1 = i
for j in list_id_category:
    if j != i:
        category2 = j
        bundle = i + '-' + j
    for k in list_id_category:
        if i != k and j != k:
            category3 = k
            bundle = i+'-'+j+'-'+k
            bundling_list.append(bundle)

但是我的代码只是填充了 1,2,3 条件。它不满足第四个条件。有人知道如何解决吗?谢谢你。

标签: pythonfor-loop

解决方案


以下生成器函数将在不过度生成和过滤的情况下工作:

def combos(lst):
    n = len(lst)
    for i in range(n-1):
        for j in range(i, n):
            for k in range(max(i+1, j), n):
                yield lst[i], lst[j], lst[k]

list(combos([1,2,3])]
# [(1, 1, 2), (1, 1, 3), (1, 2, 2), (1, 2, 3), (1, 3, 3), (2, 2, 3), (2, 3, 3)]

list(map("-".join, combos(['c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'c10'])))
# ['c1-c1-c2', 'c1-c1-c3', 'c1-c1-c4', 'c1-c1-c5', 'c1-c1-c6', 
#  'c1-c1-c7', 'c1-c1-c8', 'c1-c1-c9', 'c1-c1-c10', 'c1-c2-c2', 
#  'c1-c2-c3', ... , 'c9-c10-c10']

推荐阅读