[python, codereview] список всех пар в последовательности

july

Можно ли лучше записать функцию, которая выдает список всех отличных между собой пар элементов из заданного списка:

def allpairs(seq):
if len(seq) <= 2: return [seq]
else:
return [(seq[0], s) for s in seq[1:]] + allpairs(seq[1:])

apl13

А где здесь отличность между собой?

july

Да, я плохо сформулировал. Надо было: с неповторяющимися номерами в последовательности.

Serab

Имхо это вообще жесть

>>> allpairs( [ 1 ] )
[1]

не говоря уже о

>>> allpairs( [ 2, 3, 4 ] )
[(2, 3 (2, 4 3, 4]

и

>>> allpairs( [ 1, 2, 2 ] )
[(1, 2 (1, 2 2, 2]

в общем, да, можно написать ее как минимум правильно =)

Serab

Надо было: с неповторяющимися номерами в последовательности.
тем не менее ошибка в проверке условия выхода остается. Да и для списка единичной длины тоже надо бы адекватнее реагировать.

july

1. Мда. А лучше что выдавать?
2. Исправил
3. Плохо сформулировал условие насчет различности между собой

Serab

1. Мда. А лучше что выдавать?
хз, пустой список. Ну либо исключение :grin:

july

Сейчас:

>>> allpairs([2,3,4])
>>> [(2, 3 (2, 4 [3, 4]]

А как адекватнее?

Serab

А как адекватнее?
не, ну тут все нормально же. Я про первый пункт говорил.

july

Да, пожалуй, пустой список будет лучше. Спасибо.

lubanj

codereview
название темы ржачное

july

я старался

apl13

allpairs []  = []
allpairs (x:xs) = map (\y -> [x,y]) xs ++ (allpairs xs)

Как-то так.
Не питон, правда...

july

Прошу прощения за безграмотность: это Хаскель или ML?

apl13

Первое.

agaaaa

Это Haskell
На ML будет как-то так:
let reс allpairs = function
| [] -> []
| x :: xs -> List.map (fun y -> [x; y]) xs @ allpairs xs

bleyman

Я не очень понял, что имелось в виду, с исправлениями кода етс.
itertools.combinations(iterable, 2) — оно?
# combinations('ABCD', 2) --> AB AC AD BC BD CD
reference implementation
EDIT: я к тому, что если не меряться письками, а хотеть получить результат, то следует использовать эффективную, написанную на С библиотечную функцию. А для этого нужно знать свои библиотечные функции, а не меряться письками атакже изучать функциональные языки программирования!

july



а хотеть получить результат,
О да, да, я очень хотеть получить результат!
Но про itertools я не знал. Теперь знаю, спасибо. Меряться ничем не собирался :)

Serab

>>> allpairs([2,3,4])
>>> [(2, 3 (2, 4 [3, 4]]
А как адекватнее?
кстати, только сейчас заметил. Понятно, что адекватнее

>>> allpairs([2,3,4])
>>> [(2, 3 (2, 4 (3, 4)]

july

Да, спасибо, я это уже успел исправить. Но теперь скромно пользуюсь combinations из itertools дабы не плодить лишний сучностей :)

Serab

Тут DarkGray собирал набор советов. Там было "import this" :grin:

july

Ну, про это-то я в курсе :)
Хотя вот с этим согласиться не могу:
Flat is better than nested.
Sparse is better than dense.
Оставить комментарий
Имя или ник:
Комментарий: