Найти - Пользователи
Полная версия: Обработка списка из tuple'ов или list'ов
Начало » Python для новичков » Обработка списка из tuple'ов или list'ов
1
_alexs_
Часто приходится работать со списками, элементами которых являются либо другие списки, либо 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-специфичные методы для решения этой и подобных задач и что почитать по этой теме?
reclosedev
Как вариант:
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

Singularity
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()
alexey-grom
Тоже однопроходовый но более читабельный вариант чем у топикстартера

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()
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