从多个列表中找到正确的组合

时间:2018-10-05 14:00:57

标签: python python-3.x

我想知道是否有更好的方式编写与以下代码相同的代码:

我想在abc这三个列表中寻找组合,每个a[i]b[j],{{1 }}长度大于10,然后返回总长度。有没有更好的方法来编写此代码?

c[k]

3 个答案:

答案 0 :(得分:0)

例如,len(z) = 15len(y)=13可能会导致您的代码失败,因为您需要len(x) >= len(y) >= len(z) > 10。而是尝试:

def func(**kwarg):
    nt = namedtuple('nt', ['a', 'b', 'c'])
    for  x in kwargs['a']:
        for  y in kwargs['b']:
            for  z in kwargs['c']:
                if len(x) > 10 and len(y) > 10 and len(z) > 10:
                    return nt(a_header=x, b_header=y, c_header=c, all_len=len(x) + len(y) + len(z))
return ()

答案 1 :(得分:0)

如果您想要that each a[i], b[j], c[k] length larger than 10 ...

不要使用嵌套的for循环。

取而代之的是分别检查每个列表(kwargs['a'],然后是kwargs['b'],然后是kwargs['c']),然后找到长度大于10的所有元素(元素的位置)。复杂度为{{ 1}},其中O(n)是所有列表的总长度。

最后一一计算所有可能的总和或收益总和。

答案 2 :(得分:0)

使用 itertools.product 我们可以为每个列表创建一项的所有3种方式组合。我们可以获取这些产品列表,并将其过滤为仅包含lens >= (3, 6, 10) "i want 3 >= 6 >= 10" - OP 的产品。

from itertools import combinations

lista = [(x, y, z) for x, y, z in product(a, b, c)]
res = list(filter(lambda x: len(x[0]) >= 3 and len(x[1]) >= 6 and len(x[2]) >= 10, l))
print(*res)

或对于一线解决方案使用列表理解

res = [(u, v, w) for u, v, w in product(a, b, c) if len(u) >= 3 and len(v) >= 6 and len(w) >= 10]
('a22', 'b11111', 'c333333333')