Форум сайта python.su
0
Такая задача: дан список строк, необходимо написать функцию, которая будет возвращать список “правильных” строк.
Под правильной строкой пониматется строка, которая состоит из уникальных символов, т.е. этих же символов не должно быть в других строках.
Пример:
['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
res_lst.remove(i)
res_lst.remove(res_lst[lst.index(i)])
Офлайн
7
Опять 25, нельзя идти по элементам списка и в то же время удалять их, тем более дважды )
Тут ведь можно создать второй список из правильных строк
Офлайн
0
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)
Офлайн
1
Первая итерация:
{'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)
Офлайн
33
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)
Офлайн
43
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)
Офлайн
33
sergeek
Что нужно съесть/покурить/прочитать/пережить, чтобы в голове появлялись такие решения?
Офлайн
58
От себя добвалю: выпить, съесть, увидеть, услышать ….
Отредактировано 4kpt_II (Янв. 6, 2014 19:05:05)
Офлайн
43
Budulianinне знаю
Что нужно съесть/покурить/прочитать/пережить, чтобы в голове появлялись такие решения?
Я просто представляю в уме последовательность преобразований над входными данными для получения выходных и записываю их в наименее императивной форме. Офлайн
33
sergeek
в наименее императивной форме.
Офлайн