LINUX.ORG.RU

lambda, filter

 ,


1

1

Помогите разобраться с сабжем. Есть простенькая задача - вернуть список только с уникальными значениями. Я решил, что питоновскую функциональщину можно как раз для этого и заюзать. Накидал вот это:

strings = ['one', 'two', 'two', 'one', 'three']
list = []
list = filter(lambda x: list.count(x) = 0, strings)
Понял, почему оно не работает. Но накидать рабочий вариант так и не смог.

Deleted
Ответ на: комментарий от pi11

Спасибо!

П.С. Так просто, что даже не интересно :(

Deleted
()

функциональщина

мутабельность

Выбери что-нибудь одно же. Алсо filter + lambda практически всегда меняют на list comprehension (x for x in strings if <условие>, но ты не можешь одновременно менять список и искать в нём)

x3al ★★★★★
()
def set(list):
  def inner_set(acc, list):
    if [] == list or None is list:
       return acc
    head = list[0]
    rest = list[1:]
    if head not in rest:
       acc.append(head)
    return inner_set(acc, rest)
  return inner_set([], list)

Что-то типа такого. А теперь гуру питона, расскажите как это переписать на ленивых генераторах, без рекурсии.

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 2)
Ответ на: комментарий от x3al

но ты не можешь одновременно менять список и искать в нём)

Да, этоя понял еще в первом мосте. А жаль, что нельзя :(

Deleted
()
Ответ на: комментарий от Bad_ptr
#!/usr/bin/env python
# -*- coding: utf-8 -*-

def _set(iterable):
    visited = set()
    for item in iterable:
        if item not in visited:
            visited.add(item)
            yield item

Да, в пистоне нужно очень аккуратно подходить к именованию своих функций/классов.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от Deleted

Тащемта, если очень хочется, то можно менять список, а искать в его копии.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

visited = set()

Ну это уж слишком.
Там при visited.add(item) явно будут проверки(а мы её и так делаем, т.е. будет 2 раза одна и та же работа) и тормоза

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

Там при visited.add(item) явно будут проверки(а мы её и так делаем, т.е. будет 2 раза одна и та же работа) и тормоза

Явно будет быстрее, чем линейный поиск в списке.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

так это уже повторная проверка будет, ненужная.

if item not in visited

это первая, которая всё и делает

visited.add(item)

а тут снова будет пробегание по visited(внутри метода add) и сравнение, нету ли там уже item, а его там точно нету
ну это так, придирки, короче. В остальном всё нормально)

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 2)
Ответ на: комментарий от Bad_ptr

а тут снова будет пробегание по visited(внутри метода add) и сравнение, нету ли там уже item, а его там точно нету

Ну и что? Поиск в множестве будет на порядки быстрее поиска в списке (не считая всяких вырожденных случаев).

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

а ок, скорее всего действительно так будет быстрее.

Bad_ptr ★★★★★
()

Очередной провал автора постов, статей и компиляторов. Ты в каждом треде рассказывал, как ты написал свой си. Твое потрясающее неумение гуглить или читать доки навевает мысли о том, что ты балабол. https://www.google.com/search?hl=en&newwindow=1&safe=off&tbo=d&output=search&sclient=psy-ab&q=python+filter+non+unique&btnG=&oq=&gs_l=&pbx=1

anonymous
()
lambda x: list.count(x) = 0

Понял, почему оно не работает.

Наверное, потому что это чушь, а не питон.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)

Если хочешь правильно использовать функциональшину, то советую глянуть на самые основы хаскелла, потом будет намного проще приминять эти приемы в других языках, a то что ты пытался сделать это полная чушь.

zinfandel ★★
()
Последнее исправление: zinfandel (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.