Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 6, 2014 13:41:17

kozlo22
От: Беларусь, Минск
Зарегистрирован: 2012-11-01
Сообщения: 115
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти "правильные" слова.

Такая задача: дан список строк, необходимо написать функцию, которая будет возвращать список “правильных” строк.
Под правильной строкой пониматется строка, которая состоит из уникальных символов, т.е. этих же символов не должно быть в других строках.
Пример:

['noise', 'qw', 'job']
вернуть должно
['qw']
Вот что я понаписывал.
def regular_words_counter(lst):
	count = 0
	new_lst = lst
	res_lst = lst
	print(res_lst)
	for i in lst:
		new_lst.remove(i)
		for j in new_lst:
			if {x for x in i}.isdisjoint({x for x in j}):
				res_lst.remove(i)
	return res_lst
Ошибка ValueError: list.remove(x): x not in list
Если 10 строке поменять:
 res_lst.remove(i) 
на
res_lst.remove(res_lst[lst.index(i)])
То вылазит ошибка:
'A' not in the list.
Я не могу понять: куда А деется и как должно выглядеть решение.

Офлайн

#2 Янв. 6, 2014 14:34:17

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Найти "правильные" слова.

Опять 25, нельзя идти по элементам списка и в то же время удалять их, тем более дважды )

Тут ведь можно создать второй список из правильных строк



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Офлайн

#3 Янв. 6, 2014 15:13:00

kozlo22
От: Беларусь, Минск
Зарегистрирован: 2012-11-01
Сообщения: 115
Репутация: +  0  -
Профиль   Отправить e-mail  

Найти "правильные" слова.

Master_Sergius
Опять 25, нельзя идти по элементам списка и в то же время удалять их, тем более дважды )Тут ведь можно создать второй список из правильных строк
Окей, если так:
 def regular_words_counter(lst):
	count = 0
	new_lst = lst
	res_lst = []
	for i in lst:
		new_lst.remove(i)
		for j in new_lst:
			if {x for x in i}.isdisjoint({x for x in j}):
				res_lst.append(i)
	return res_lst
то
 ['noise', 'job'] 

Отредактировано kozlo22 (Янв. 6, 2014 15:13:28)

Офлайн

#4 Янв. 6, 2014 16:01:35

d1skort
Зарегистрирован: 2013-12-13
Сообщения: 1
Репутация: +  1  -
Профиль   Отправить e-mail  

Найти "правильные" слова.

Первая итерация:
{'n', ‘o’, ‘i’, ‘s’, ‘e’} и {'q', ‘w’} не имеют общих элементов. Добавляет в res_lst элемент ‘noise’.

Написал на коленке, вроде работает, лучше затести

def foo(lst):
	new_lst = lst
	res = []
	for i in lst:
		index = new_lst.index(i)
		new_lst.remove(i)
		flag = True
		for j in new_lst:
			if not {x for x in i}.isdisjoint({x for x in j}):
				flag = False
		if flag:
			res.append(i)
		new_lst.insert(index, i)
	return res

Отредактировано d1skort (Янв. 6, 2014 16:11:43)

Офлайн

#5 Янв. 6, 2014 17:13:55

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Найти "правильные" слова.

kozlo22
как должно выглядеть решение.

def find_true_strings(lst):
    lst_set = list(map(set, lst))
    mem = []
    for num1, elem1 in enumerate(lst_set):
        if num1 in mem:
            continue
        bad_str = False
        for num2, elem2 in enumerate(lst_set[num1+1:], num1+1):
            if elem1 & elem2:
                mem.append(num2)
                bad_str = True
        if not bad_str:
            yield lst[num1]



Отредактировано Budulianin (Янв. 6, 2014 17:14:43)

Офлайн

#6 Янв. 6, 2014 18:42:27

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Найти "правильные" слова.

from functools import reduce
 
def rotations(lst):
    x, *xs = lst
    for _ in range(len(lst)):
        yield x, xs
        x, *xs = xs + [x]
 
def regs(lst):
    return [elt for elt, rest in rotations(lst)
            if not set(elt) & reduce(set.union, rest, set())]
    

Отредактировано sergeek (Янв. 6, 2014 18:44:50)

Офлайн

#7 Янв. 6, 2014 19:02:30

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Найти "правильные" слова.

sergeek

Что нужно съесть/покурить/прочитать/пережить, чтобы в голове появлялись такие решения?



Офлайн

#8 Янв. 6, 2014 19:04:43

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Найти "правильные" слова.

От себя добвалю: выпить, съесть, увидеть, услышать ….

Отредактировано 4kpt_II (Янв. 6, 2014 19:05:05)

Офлайн

#9 Янв. 6, 2014 19:24:36

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Найти "правильные" слова.

Budulianin
Что нужно съесть/покурить/прочитать/пережить, чтобы в голове появлялись такие решения?
не знаю Я просто представляю в уме последовательность преобразований над входными данными для получения выходных и записываю их в наименее императивной форме.

Офлайн

#10 Янв. 6, 2014 19:31:07

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Найти "правильные" слова.

sergeek
в наименее императивной форме.

А потомкам ты такой же код в подарок оставляешь ? :)

Может книги какие по функциональщине читал?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version