Уникальное единственное декартово произведение нескольких списков

Следующее хорошо работает для cart_product([1,2,3], [a,b,c], [v]), не возвращает ли оно повторяющееся декартово произведение, если да, то как получить уникальные декартовы произведения?

import itertools
def cart_product(*somelists):
    for element in itertools.product(*somelists):
        print element

также это не работает, когда я передаю список, содержащий списки [ [1,2,3],[a,b,c],[v] ]


person I Love Python    schedule 13.11.2013    source источник
comment
это отлично работает для меня. Что вы имеете в виду под дубликатами товаров?   -  person Paul Draper    schedule 13.11.2013
comment
это не сработало для меня, и я нашел свой ответ. люди, похоже, не в восторге от этого.   -  person I Love Python    schedule 13.11.2013


Ответы (1)


  1. Чтобы получить только уникальные элементы, вы можете использовать такое обозначение набора (Примечание: это не гарантирует порядок)

    return list({element for element in itertools.product(*somelists)})
    

    или, согласно комментарию Пола Дрейпера, мы можем сделать это так

    list(set(itertools.product(*somelists)))
    

    Если вы хотите поддерживать порядок, а также

    import itertools
    def cart_product(somelists):
        result, tempSet = [], set()
        for element in itertools.product(*somelists):
            if element not in tempSet:
            tempSet.add(element)
            result.append(element)
        return result
    
  2. Чтобы ваша программа работала со списком списков, просто измените объявление функции с

    def cart_product(*somelists):
    

    to

    def cart_product(somelists):
    
person thefourtheye    schedule 13.11.2013