列表列表内和列表之间的排列[python]

时间:2017-09-21 21:17:36

标签: python combinations permutation

有很多相关的问题,但没有一个我可以找到完全正在寻找的问题。从本质上讲,我希望将每个子列表的所有排列组合在一起,以便进行所有可能的组合,但要将它们分开。就这样:

'use strict';

describe('login to admin app', function(){
    beforeEach(function(){
        browser.get('http://localhost:3000/#!/login');

        it('expect to be on the login page', function(){
            expect(browser.findElement(by.className('login-page')).isPresent()).toBe(true);

        });

        it('login to application', function(){
            var loginInput = browser.findElement(by.name('username'));
            var passwordInput = browser.findElement(by.name('password'));

            var submitButton = browser.findElement(by.tagNam('button'));

            loginInput.sendKeys('****');
            passwordInput.sendKeys('****');

            submitButton.click();

            expect(browser.getCurrentUrl()).toMatch('http://localhost:3000/#!/landing');
        });

        it('check header after login', function(){
            var loginInput = browser.findElement(by.name('username'));
            var passwordInput = browser.findElement(by.name('password'));

            var submitButton = browser.findElement(by.tagNam('button'));

            loginInput.sendKeys('*****');
            passwordInput.sendKeys('*****');

            submitButton.click();

            expect(browser.findElement(by.id('role')));
            expect(browser.findElement(by.id('username')));

            var languages = brower.findElement(by.className("language"));
            expect(language[0][0].getText().toEqual("NL"));
            expect(language[1][0].getText().toEqual("FR"));


        });


    });
});

期望的输出:

input=[[1,2,3],[4],[5,6]]

等...

我相信下面的代码会起作用,但我想知道是否有更高效或简洁的策略。非常感谢你。

[[1,2,3],[4],[6,5]]

[[2,1,3],[4],[5,6]]

[[2,1,3],[4],[5,6]]

[[3,1,2],[4],[5,6]]

2 个答案:

答案 0 :(得分:2)

我们可以首先使用列表推导来为每个子列表生成所有排列:

perms = [list(map(list,permutations(subl))) for subl in data]

然后我们可以使用product来获取产品。

for data in product(*perms):
    print(list(data))

或完整:

from itertools import permutations, product

def product_perms(data):
    perms = [list(map(list,permutations(subl))) for subl in data]
    for data in product(*perms):
        print(list(data))

这会产生:

>>> product_perms(data)
[[1, 2, 3], [4], [5, 6]]
[[1, 2, 3], [4], [6, 5]]
[[1, 3, 2], [4], [5, 6]]
[[1, 3, 2], [4], [6, 5]]
[[2, 1, 3], [4], [5, 6]]
[[2, 1, 3], [4], [6, 5]]
[[2, 3, 1], [4], [5, 6]]
[[2, 3, 1], [4], [6, 5]]
[[3, 1, 2], [4], [5, 6]]
[[3, 1, 2], [4], [6, 5]]
[[3, 2, 1], [4], [5, 6]]
[[3, 2, 1], [4], [6, 5]]

如果您想返回这样的列表,您可以使用:

def product_perms(data):
    perms = [list(map(list,permutations(subl))) for subl in data]
    return [list(data) for data in product(*perms)]

答案 1 :(得分:0)

And_the_case [[3,1,2],[4],[5,6,[7,8 [9,10,11]]?如果是嵌套列表?