import itertools
l = [1, 1, 3, 4]
r = [perm for perm in itertools.permutations(l, 2) if sorted(perm) == list(perm)]
приводит:
[(1, 1), (1, 3), (1, 4), (1, 1), (1, 3), (1, 4), (3, 4)]
Если вы хотите, чтобы результаты отсортированы, и уникальные:
s = sorted(set(r)) # [(1, 1), (1, 3), (1, 4), (3, 4)]
Если вы хотите, чтобы результаты как списки вместо кортежей, просто бросить их list()
Используя рецепт itertools.permutations
я сделал эту функцию удобства для вас:
def sorted_perms(iterable, r=None):
pool = tuple(sorted(iterable))
n = len(pool)
r = n if r is None else r
for indices in itertools.product(range(n), repeat=r):
if len(set(indices)) == r and tuple_is_sorted(indices):
yield tuple(pool[i] for i in indices)
memo = {} # simple memoization for efficiency.
def tuple_is_sorted(t):
return memo.setdefault(t, bool(sorted(t) == list(t)))
r = list(sorted_perms(l, 2)) # [(1, 1), (1, 3), (1, 4), (1, 3), (1, 4), (3, 4)]
s = sorted(set(r)) # [(1, 1), (1, 3), (1, 4), (3, 4)]
Почему вы должны '[1,3]' 'дважды, но [1,1]' только один раз? Как вы хотите лечить дубликаты? –
Итак, вы не хотите удалять дубликаты? Тогда ответ от @Inbar отлично подходит. Просто сделайте 'sorted (r)' вместо того, чтобы кастинг для 'set' сначала. –