【问题标题】:Python generate tuple combination with criteriaPython生成带有条件的元组组合
【发布时间】:2018-08-17 20:11:20
【问题描述】:

试图生成一个排除 c 中提到的组合的组合,但不确定如何继续。

a = [1.01, 5.84, 13.86]

b = [6.42,0,18.24]

c = [(1.01,18.24), (13.86,0), (5.84,0)]

combination = [(x,y) for x in a 

                     for y in b]

预期结果: (1.01,6.42), (1.01,0), (5.84,6.42), (5.84,18.24), (13.86,6.42), (13.86,18.24)

【问题讨论】:

    标签: python-3.x tuples combinations


    【解决方案1】:

    您可以使用itertools.product生成组合,然后通过比较排除它们

    from itertools import product
    a = [1.01, 5.84, 13.86]
    b = [6.42,0,18.24]
    c = [(1.01,18.24), (13.86,0), (5.84,0)]
    
    combs = list(product(a,b))
    
    [(1.01, 6.42),
     (1.01, 0),
     (1.01, 18.24),
     (5.84, 6.42),
     (5.84, 0),
     (5.84, 18.24),
     (13.86, 6.42),
     (13.86, 0),
     (13.86, 18.24)]
    
    
    new_combs = [x for x in combs if x not in c]
    
    [(1.01, 6.42),
     (1.01, 0),
     (5.84, 6.42),
     (5.84, 18.24),
     (13.86, 6.42),
     (13.86, 18.24)]
    

    注意:如 cmets 中所述,combs 周围的 list 用于演示,以便您可以查看所有组合。相反,您可能想要这样做:

    new_combs = [x for x in product(a,b) if x not in c]
    

    这里有更多关于元组和列表比较的信息: How does tuple comparison work in Python?

    元组逐个位置进行比较:第一个元组的第一项与第二个元组的第一项进行比较;如果它们不相等,这是比较的结果,否则考虑第二项,然后考虑第三项,依此类推。

    还有:
    序列类型也支持比较。特别是,元组和列表通过比较相应的元素来按字典顺序进行比较。这意味着要比较相等,每个元素必须比较相等,并且两个序列必须是相同类型且具有相同长度。

    【讨论】:

    • 不错的答案!如果你愿意,你也可以省略 combs 周围的 list 包装器,这样你就可以在最终的理解中懒惰地迭代它,如果输入列表非常大,这会更节省内存。跨度>
    • @user3483203 你是什么意思? [ ] 应该在 new_combs 被忽略
    • 您所做的编辑就是我所指的。通过直接迭代 product(a, b),您的内存效率会更高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2019-08-06
    • 2021-09-26
    相关资源
    最近更新 更多