Найти - Пользователи
Полная версия: Формируем множество из коллекции
Начало » Python для новичков » Формируем множество из коллекции
1
tibs
Работаю с коллекцией элементов. Как удалить строки с повторяющимися емайлами, чтобы не нарушился порядок следования строк? Возможно ли применение функции 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$

Еще сталкивался с аналогичной проблемой сортировки коллекции по какому-либо параметру. Возможно ли такое?
py
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

Вариант решения задачи с set самому хотелось бы посмотреть.
reclosedev
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)

Хорошая стать по сортировке есть на Python Wiki: Sorting Mini-HOW TO

py
Вариант решения задачи с set самому хотелось бы посмотреть.
Если в вашем коде заменить emails = на emails = set и emails.append на emails.add, вот оно и решение
tibs
Большое спасибо за помощь. Все получилось :)

В множестве ведь исходный порядок следования записей может измениться?
FishHook
tibs
Работаю с коллекцией элементов. Как удалить строки с повторяющимися емайлами, чтобы не нарушился порядок следования строк? Возможно ли применение функции 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$

Еще сталкивался с аналогичной проблемой сортировки коллекции по какому-либо параметру. Возможно ли такое?
Попробуйте заюзать OrderedDict из модуля collections стандартной библиотеки
>>> 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'
>>> 
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