Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Scala partition в Python

with 8 comments

Вперше сьогодні в мене був момент “А якби я писав на Scala…”. Задача – є список з мухами і котлетами вкупі. Треба мухи окремо, котлети окремо.

В Python класично це так:

Frikadellen = [x for x in AllesZusammen if IstFrikadelle(x)]
Fliegen = [x for x in AllesZusammen if not IstFrikadelle(x)]

В Scala:

(Frikadellen, Fliegen) = AllesZusammen partition IstFrikadelle

Scala, окрім того що коротша, виграє тим що проходиться по списку лише раз.

Але StackOverflow як завжди дає жару:

Frikadellen, Fliegen = [], []
for x in AllesZusammen:
    (Fliegen, Frikadellen)[IstFrikadelle(x)].append(x)
    # або
    # (Frikadellen if IstFrikadelle(x) else Fliegen).append(x)

Це вже краще, але все одно було б добре якби до списку додали метод partition. Може б то Ґвідо поскаржитись?

Advertisements

Written by bunyk

Лютий 27, 2015 at 00:04

Оприлюднено в Кодерство

Tagged with ,

Відповідей: 8

Subscribe to comments with RSS.

  1. Да, у Скали багата стандартна бібліотека щодо операцій над списками.

    Але написати у Пітоні свій власний partition не так і важко, тільки що він буде функцією, а не методом.

    dmytrish

    Лютий 27, 2015 at 00:19

    • Гвідо ж тут навряд чи допоможе, він навіть на

      reduce()

      (який у хаскелістів fold і є майже сакральним через те, що через нього робляться практично всі інші операції над списками) хмурився і казав, що не вистачає пітонячої простоти і просвітленості.

      dmytrish

      Лютий 27, 2015 at 00:21

    • Хехе, ось хаскельний варіант partition через fold:

      part p = foldr (\x (pos, neg) -> bool (x:pos, neg) (pos, x:neg) $ p x) ([], [])

      Довго намагався написати це на пітоні через reduce та lambda, але замучився боротись із помилками про NoneType. А імперативний варіант простий, хоч і довгий:

      >>> def part(fn, lst):
      ...     x, y = [], []
      ...     for v in lst:
      ...         x.append(v) if fn(x) else y.append(v)
      ...             
      ...     return x, y
      ... 
      

      dmytrish

      Лютий 27, 2015 at 00:59

  2. у мене в кожному проекті з.являються модулі типу

    – mappings.py
    – iterables.py

    Навіть добре що partition не в ліст можна її застосувати до будь-якого ітератора

    signalpillar

    Лютий 27, 2015 at 03:05

  3. А як щодо http://pastebin.com/xfebY5PS ?

    Bartash

    Травень 18, 2015 at 13:52


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: