Найти - Пользователи
Полная версия: Найти "правильные" слова.
Начало » Python для новичков » Найти "правильные" слова.
1 2 3
kozlo22
Такая задача: дан список строк, необходимо написать функцию, которая будет возвращать список “правильных” строк.
Под правильной строкой пониматется строка, которая состоит из уникальных символов, т.е. этих же символов не должно быть в других строках.
Пример:
['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.
Я не могу понять: куда А деется и как должно выглядеть решение.
Master_Sergius
Опять 25, нельзя идти по элементам списка и в то же время удалять их, тем более дважды )

Тут ведь можно создать второй список из правильных строк
kozlo22
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'] 
d1skort
Первая итерация:
{'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
Budulianin
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]
sergeek
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())]
    
Budulianin
sergeek

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

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

Может книги какие по функциональщине читал?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB