Форум сайта python.su
Добра всем!
Задача: удалить уникальные элементы из списка и вывести получившийся список.
Вот такое решение:
data = [10, 9, 10, 10, 9, 8] a = data.copy() # создаю поверхностную копию спиcка data # в цикле перебираю значения data, а удаляю данные из списка а, его и вывожу for i in range(len(data)): if data.count(data[i]) == 1: a.remove(data[i]) print(a)
[code]data = [1, 2, 3, 4, 5] # в цикле перебираю значения data, удаляю данные из списка, вывожу for i in range(len(data)): if data.count(data[i]) == 1: data.remove(data[i]) print(data) Traceback (most recent call last): File "<pyshell#22>", line 2, in <module> if data.count(data[i]) == 1: IndexError: list index out of range[/code]
print([data.remove(data[i]) for i in range(len(data)) if data.count(data[i]) == 1])
a = [data.remove(data[i]) for i in range(len(data)) if data.count(data[i]) == 1] print(a)
Отредактировано lupanton (Апрель 4, 2018 09:12:20)
Офлайн
Так подойдёт?
[i for i in data if data.count(i)-1]
Офлайн
lupantonНужно один раз пройти по всему списку. Надо сделать словарь и множество: в словарь складываешь пары (встретившийся элемент, его номер в исходном списке); во множество складываешь повторившиеся элементы, которые ты переводишь из словаря, удаляя их в словаре. Когда исходный список закончится, то у тебя останется словарь уникальных элементов с их номерами в исходном списке и множество с повторившимися элементами. После этого ты сортируешь словарь по значениям (номерам в исходном списке) и берёшь только ключи словаря. Так у тебя получается выходной список с уникальными элементами.
Как сделать это красиво и почему?
Отредактировано py.user.next (Апрель 4, 2018 09:26:00)
Офлайн
Спасибо! Да, так работает. А почему? В чем механика?
i for i in data if data.count(i)-1
for i in data: if data.count(i).....
Офлайн
py.user.next
py.user.nextможно пример кода, что то я никак не вникну в эту суть
Надо сделать словарь и множество: в словарь складываешь пары (встретившийся элемент, его номер в исходном списке); во множество складываешь повторившиеся элементы, которые ты переводишь из словаря, удаляя их в словаре.
Офлайн
>>> l =[10,10,9,9, 8,9] >>> d ={} >>> for i in l: d.setdefault(i,0) d[i] += 1 >>> d {10: 2, 9: 3, 8: 1} >>> [ i for i in l if d[i] > 1] [10, 10, 9, 9, 9] >>>
Офлайн
marvellik
можно пример кода
>>> lst = [1, 2, 3, 1, 2, 4, 'a', 'b', 'a'] >>> >>> seen = {} >>> rep = set() >>> n = 0 >>> >>> for e in lst: ... if e not in rep: ... if e in seen: ... rep.add(e) ... del seen[e] ... else: ... seen[e] = n ... n += 1 ... >>> seen {3: 2, 4: 3, 'b': 5} >>> rep {1, 2, 'a'} >>>
vic57vic57 пошёл по списку второй раз. Один раз можно пройти.[ i for i
Отредактировано py.user.next (Апрель 4, 2018 11:18:51)
Офлайн
py.user.nextпервый проход - счетчик, второй - массив по условию
vic57 пошёл по списку второй раз. Один раз можно пройти.
Офлайн
lupantonв этом методе для каждого елемента списка будет будет вызываться count() - перебор всего списка
Спасибо! Да, так работает. А почему? В чем механика?
i for i in data if data.count(i)-1
from time import time def f1(lst): return [i for i in lst if lst.count(i)-1] def f2(lst): d = {} for i in lst: d.setdefault(i,-1) d[i] += 1 return [i for i in lst if d[i]] l = list(range(10000)) + [1,2,3] t0 = time() l1 = f1(l) print(time() - t0,l1) t0 = time() l2 = f2(l) print(time() - t0,l2)
1.8144128322601318 [1, 2, 3, 1, 2, 3] 0.00427699089050293 [1, 2, 3, 1, 2, 3]
Офлайн
py.user.next так результат не соответствует заданию
lupanton
Задача: удалить уникальные элементы из списка и вывести получившийся список
data = [1, 2, 3, 1, 2, 4, 'a', 'b', 'a'] dict_data = {} for i,x in enumerate(data): dict_data[x] = dict_data.get(x,0)+1 print(list(filter(lambda x : dict_data.get(x) > 1,data )))
[1, 2, 1, 2, 'a', 'a']
Отредактировано marvellik (Апрель 4, 2018 12:13:56)
Офлайн