python - 使用 for 循环进行列表绑定
问题描述
我正在使用列表进行产品捆绑。这是列表:
list_id_category = ['c1','c2','c3','c4','c5','c6','c7','c8','c9','c10']
这是我需要的条件:
- 每个捆绑包含 3 个产品(例如:c1-c2-c3)
- 捆绑中不能只有一种类别(例如:c1-c1-c1 => 不允许)
- 每个捆绑可能有 2 个相同的类别(例如:c1-c1-c2)
- 每个捆绑的顺序没有区别(例如: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 条件。它不满足第四个条件。有人知道如何解决吗?谢谢你。
解决方案
以下生成器函数将在不过度生成和过滤的情况下工作:
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']
推荐阅读
- python - Ansible InventoryManager 子集方法抛出 TypeError
- extjs - 如何用双击事件替换默认单击事件以在 ExtJS 中选择网格行
- apache-flink - Searalize protobuff 数据到 avro - Apache Flink
- php - 在另一个类函数中使用另一个类函数
- c++ - cv::Mat::split(args) 的正确参数
- php - 我可以在 Laravel 中使用 php deployer 进行 CI/CD 吗?
- java - 当您从任务栏关闭 javafx 应用程序时会触发什么事件以及如何处理它?
- python - 在 matplotlib 中绘图时如何隐藏文本
- java - JPA OneToOne 映射的 AngularJs $http Post Requst 返回字符串而不是 JSON 数据
- reactjs - React Formik onSubmit Async 调用了两次