Форум сайта python.su
Часто приходится работать со списками, элементами которых являются либо другие списки, либо tuple. В процессе работы необходимо производить анализ и выбрать определенные записи. Например, есть список:
data = [ ('data1', 'id1', 3256), ('data2', 'id2', 809), ('data3', 'id3', 1284), ('data1', 'id4', 3107), ('data3', 'id5', 2751), ('data2', 'id6', 452), ]
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 ] ]
Офлайн
Как вариант:
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
Офлайн
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)
Офлайн
Тоже однопроходовый но более читабельный вариант чем у топикстартера
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()
Офлайн