Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 2, 2012 19:19:07

_alexs_
Зарегистрирован: 2012-04-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка списка из tuple'ов или list'ов

Часто приходится работать со списками, элементами которых являются либо другие списки, либо tuple. В процессе работы необходимо производить анализ и выбрать определенные записи. Например, есть список:

data = [ ('data1', 'id1', 3256),
         ('data2', 'id2', 809),
         ('data3', 'id3', 1284),
         ('data1', 'id4', 3107),
         ('data3', 'id5', 2751),
         ('data2', 'id6', 452), ]
Первый элемент tuple может повторяться в разных элементах списка, второй — уникален для каждого элемента. Необходимо выбрать все возможные записи по первому элементу tuple, но так, чтобы третий элемент tuple был максимальным. Т.е. для примера выше в результате должно получиться
uniq = [ ('data1', 'id1', 3256),
         ('data2', 'id2', 809),
         ('data3', 'id3', 2751)]
Сейчас использую вот такой подход
unique = dict()
for r in data:
  if r[ 0 ][ 0 ] not in unique:
    unique[ r[ 0 ][ 0 ] ] = [ r[ 1 ], r[ 2 ] ]
  else:
    if unique[ r[ 0 ][ 0 ] ][ 1 ] < r[ 2 ]:
      unique[ r[ 0 ][ 0 ] ] = [ r[ 1 ], r[ 2 ] ]
Инетресно, если ли более изящное решение? Может есть какие-то более Python-специфичные методы для решения этой и подобных задач и что почитать по этой теме?

Офлайн

#2 Апрель 2, 2012 20:09:13

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

Обработка списка из tuple'ов или list'ов

Как вариант:

import itertools
import operator
data = [('data1', 'id1', 3256),
        ('data2', 'id2', 809),
        ('data3', 'id3', 1284),
        ('data1', 'id4', 3107),
        ('data3', 'id5', 2751),
        ('data2', 'id6', 452), ]
unique = []
for key, items in itertools.groupby(sorted(data), operator.itemgetter(0)):
    unique.append(max(items, key=operator.itemgetter(2)))
print unique

Офлайн

#3 Апрель 2, 2012 21:34:37

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Обработка списка из tuple'ов или list'ов

data = [ ('data1', 'id1', 3256),
         ('data2', 'id2', 809),
         ('data3', 'id3', 1284),
         ('data1', 'id4', 3107),
         ('data3', 'id5', 2751),
         ('data2', 'id6', 452), ]
sorted_data = sorted(data, key=lambda item: item[2])
mapped_data = {item[0]: item for item in sorted_data}
uniqu = mapped_data.values()

Отредактировано Singularity (Апрель 2, 2012 21:52:55)

Офлайн

#4 Апрель 3, 2012 17:39:19

alexey-grom
От: Новосибирск
Зарегистрирован: 2012-03-09
Сообщения: 14
Репутация: +  3  -
Профиль   Отправить e-mail  

Обработка списка из tuple'ов или list'ов

Тоже однопроходовый но более читабельный вариант чем у топикстартера

data = [ ('data1', 'id1', 3256),
         ('data2', 'id2', 809),
         ('data3', 'id3', 1284),
         ('data1', 'id4', 3107),
         ('data3', 'id5', 2751),
         ('data2', 'id6', 452), ]
mapped_data = {}
for item in data:
    if item[0] in mapped_data:
        if mapped_data[item[0]][2] >= item[2]:
            continue
    mapped_data[item[0]] = item
unique = mapped_data.values()



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version