Форум сайта python.su
Работаю с коллекцией элементов. Как удалить строки с повторяющимися емайлами, чтобы не нарушился порядок следования строк? Возможно ли применение функции set() по второму параметру в коллекции элементов?
INPUT:
789376;anisimova.olia@mail.ru;Alla;10$
706858;viktorov-ladya@mail.ru;Alex;20$
773550;kuzminas73@inbox.ru;Kuzmin;13$
778715;vefil76@mail.ru;Michael;10$
793502;vefil76@mail.ru;Michael;40$
732934;vefil76@mail.ru;Michael;50$
795862;vladimir-borovinskii@mail.ru;Vladimir;100$
712108;sukhankin.igor@rambler.ru;Igor;15$
706458;viktorov-ladya@mail.ru;Alex;10$
OUTPUT:
789376;anisimova.olia@mail.ru;Alla;10$
706858;viktorov-ladya@mail.ru;Alex;20$
773550;kuzminas73@inbox.ru;Kuzmin;13$
778715;vefil76@mail.ru;Michael;10$
795862;vladimir-borovinskii@mail.ru;Vladimir;100$
712108;sukhankin.igor@rambler.ru;Igor;15$
Еще сталкивался с аналогичной проблемой сортировки коллекции по какому-либо параметру. Возможно ли такое?
Офлайн
string_list = """ 789376;anisimova.olia@mail.ru;Alla;10$ 706858;viktorov-ladya@mail.ru;Alex;20$ 773550;kuzminas73@inbox.ru;Kuzmin;13$ 778715;vefil76@mail.ru;Michael;10$ 793502;vefil76@mail.ru;Michael;40$ 732934;vefil76@mail.ru;Michael;50$ 795862;vladimir-borovinskii@mail.ru;Vladimir;100$ 712108;sukhankin.igor@rambler.ru;Igor;15$ 706458;viktorov-ladya@mail.ru;Alex;10$ """ old_list = [x for x in string_list.split('\n')][1:-1] new_list = [] emails = [] for line in old_list: email = line.split(';')[1] if email not in emails: new_list.append(line) emails.append(email) print new_list
Офлайн
tibs, для начала неплохо бы данные привести в программный формат, например, в список списков. А затем можно делать с ними все, что угодно.
Здесь в коде показана выборка уникальных записей по номеру колонки и сортировка по последней колонке (деньги?).
#!/usr/bin/env python # -*- coding: utf-8 -*- from pprint import pprint def unique_by_column(rows, col_number): unique_columns = set() for cols in rows: main_col = cols[col_number] if main_col not in unique_columns: unique_columns.add(main_col) yield cols if __name__ == '__main__': data = """789376;anisimova.olia@mail.ru;Alla;10$ 706858;viktorov-ladya@mail.ru;Alex;20$ 773550;kuzminas73@inbox.ru;Kuzmin;13$ 778715;vefil76@mail.ru;Michael;10$ 793502;vefil76@mail.ru;Michael;40$ 732934;vefil76@mail.ru;Michael;50$ 795862;vladimir-borovinskii@mail.ru;Vladimir;100$ 712108;sukhankin.igor@rambler.ru;Igor;15$ 706458;viktorov-ladya@mail.ru;Alex;10$ """ entries = [row.split(';') for row in data.splitlines()] unique_entries = list(unique_by_column(entries, 1)) pprint(unique_entries) sorted_by_money = sorted(entries, key=lambda x: int(x[3].rstrip('$'))) pprint(sorted_by_money)
pyЕсли в вашем коде заменить emails = на emails = set и emails.append на emails.add, вот оно и решение
Вариант решения задачи с set самому хотелось бы посмотреть.
Отредактировано reclosedev (Апрель 4, 2012 19:56:38)
Офлайн
Большое спасибо за помощь. Все получилось :)
В множестве ведь исходный порядок следования записей может измениться?
Отредактировано tibs (Апрель 5, 2012 01:21:52)
Офлайн
tibsПопробуйте заюзать OrderedDict из модуля collections стандартной библиотеки
Работаю с коллекцией элементов. Как удалить строки с повторяющимися емайлами, чтобы не нарушился порядок следования строк? Возможно ли применение функции set() по второму параметру в коллекции элементов?
INPUT:
789376;anisimova.olia@mail.ru;Alla;10$
706858;viktorov-ladya@mail.ru;Alex;20$
773550;kuzminas73@inbox.ru;Kuzmin;13$
778715;vefil76@mail.ru;Michael;10$
793502;vefil76@mail.ru;Michael;40$
732934;vefil76@mail.ru;Michael;50$
795862;vladimir-borovinskii@mail.ru;Vladimir;100$
712108;sukhankin.igor@rambler.ru;Igor;15$
706458;viktorov-ladya@mail.ru;Alex;10$
OUTPUT:
789376;anisimova.olia@mail.ru;Alla;10$
706858;viktorov-ladya@mail.ru;Alex;20$
773550;kuzminas73@inbox.ru;Kuzmin;13$
778715;vefil76@mail.ru;Michael;10$
795862;vladimir-borovinskii@mail.ru;Vladimir;100$
712108;sukhankin.igor@rambler.ru;Igor;15$
Еще сталкивался с аналогичной проблемой сортировки коллекции по какому-либо параметру. Возможно ли такое?
>>> d=OrderedDict() >>> d.update({'email1':'some'}) >>> d OrderedDict([('email1', 'some')]) >>> d.update({'email2':'some'}) >>> d OrderedDict([('email1', 'some'), ('email2', 'some')]) >>> d.update({'email1':'some'}) >>> d OrderedDict([('email1', 'some'), ('email2', 'some')]) >>> d['email1'] 'some' >>>
Офлайн