Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 4, 2012 16:55:28

tibs
От:
Зарегистрирован: 2011-06-30
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Формируем множество из коллекции

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

Еще сталкивался с аналогичной проблемой сортировки коллекции по какому-либо параметру. Возможно ли такое?



Офлайн

#2 Апрель 4, 2012 18:42:20

py
От:
Зарегистрирован: 2011-02-27
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Формируем множество из коллекции

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 самому хотелось бы посмотреть.



Офлайн

#3 Апрель 4, 2012 19:50:04

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Формируем множество из коллекции

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, вот оно и решение

Отредактировано reclosedev (Апрель 4, 2012 19:56:38)

Офлайн

#4 Апрель 5, 2012 00:46:58

tibs
От:
Зарегистрирован: 2011-06-30
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Формируем множество из коллекции

Большое спасибо за помощь. Все получилось :)

В множестве ведь исходный порядок следования записей может измениться?



Отредактировано tibs (Апрель 5, 2012 01:21:52)

Офлайн

#5 Апрель 5, 2012 14:43:06

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Формируем множество из коллекции

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'
>>> 



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version