2016-11-28 5 views
1

У меня есть 3 списка:Продукт с descreasing значения

a = [10, 9, 8, 7, 6] 
b = [8, 7, 6, 5, 4, 3] 
c = [6, 5, 4, 3, 2] 

мне нужно, чтобы получить все перестановки, полученные с itertools.product(), НО только если значения уменьшаются:

[10, 8, 6] # is good 
[6, 8, 4] # is not good, since 8 > 6 

Есть простой способ сделать это, или я должен идти со списком понимания и условий?

ответ

3

Вы можете сделать это с помощью списка понимания, обернув над itertools.product итератора и извлечения только тех возвращенных предметов, отсортированные в обратном направлении:

[item for item in product(a,b,c) if sorted(item, reverse = True) == list(item)] 

Пример:

from itertools import product 
a = [10,9,8,7,6] 
b = [8, 7, 6, 5, 4, 3] 
c = [6, 5, 4, 3, 2] 
[item for item in product(a,b,c) if sorted(item, reverse = True) == list(item)] 
# [(10, 8, 6), (10, 8, 5), (10, 8, 4), (10, 8, 3), (10, 8, 2) ...continues 
0

Это простой однострочное решение

>>> mylist = [10, 9, 8, 7, 6] 
>>> all(earlier >= later for earlier, later in zip(mylist, mylist[1:])) 
True 
>>> mylist = [10, 9, 7, 8, 6] 
>>> all(earlier >= later for earlier, later in zip(mylist, mylist[1:])) 
False 

Я нашел это здесь:

Determine if a list is in descending order

0

Если вы не хотите использовать списковых по какой-то причине:

def decreasing(l): 
    return all(a >= b for a, b in zip(l[:-1], l[1:])) 


filter(decreasing, product(a, b, c)) 
2

Вы можете сослаться следующий код, который не имеет списковых:

from itertools import product 
a = [10, 9, 8, 7, 6] 
b = [8, 7, 6, 5, 4, 3] 
c = [6, 5, 4, 3, 2] 
for result in product(a,b,c): 
    if sorted(result, reverse = True) == list(result): 
      print result