сопоставление python на структурах - PullRequest
1 голос
/ 23 ноября 2011

У меня есть два связанных вопроса.

Во-первых, у меня есть некоторая информация, такая как:

(732, 2378) (233, 52172) 23 ['Mona'] 7 

Есть два кортежа, два целых числа и один список. Давайте индексировать пять элементов как x [0]: x [4]

Мой первый вопрос: какую структуру данных я могу использовать для хранения этих разных предметов (извините, я новичок в python).

Второй вопрос основан на первом. Предположим, у меня есть такая структура (на данный момент давайте назовем ее списком), тогда моя главная цель - сделать следующее:

Скажите в первом и втором «списке» соответственно, у меня есть:

 x[0][1]        x[1][1]    x[3]
   V               V        V
(732, 2378) (233, 23) 23 ['jamie'] 7 
(732, 2378) (233, 43) 24 ['jamie'] 3
(732, 2378) (233, 56) 23 ['jamie'] 2

(3434, 2378) (45, 23) 23 ['hello'] 1 
(3445, 2378) (76, 43) 23 ['hello'] 2
(7834, 2378) (90, 56) 24 ['hello'] 5

Моя цель состоит в том, чтобы обойти эти две структуры и сопоставить сначала по x [1] [1] и x [2], а затем для каждой совпадающей записи найти соответствующий x [4], который минимизирует сумму значений в все подходящие элементы из обоих списков. Верните подходящие предметы из обеих структур.

В этом случае он должен вернуть: (3445, 2378) (76, 43) 23 ['привет'] 2 И (732, 2378) (233, 43) 24 [«Джейми»] 3 Поскольку сумма для этого матча, 5, является минимальной.

Я знаю, что это немного связано, но я был бы признателен за любые указатели в правильном направлении. Спасибо!

1 Ответ

2 голосов
/ 23 ноября 2011

Похоже, что структуры данных в вашем вопросе уже разумны - просто поместите их в виде списка.Если вы используете именованные кортежи , код поиска будет более читабельным, чем в противном случае.Для кода поиска / соответствия посмотрите operator.attrgetter и operator.itemgetter .

Например, здесьэто удобная форма для упорядочения данных (и в зависимости от того, что на самом деле представляют данные, вы можете выбрать более подходящие имена):

>>> from collections import namedtuple
>>> Row = namedtuple('Row', ['Pair0', 'Pair1', 'Scalar0', 'Names', 'Scalar1'])
>>> d = [
         Row((732, 2378), (233, 23), 23, ['jamie'], 7),
         Row((732, 2378), (233, 43), 24, ['jamie'], 3),
         Row((732, 2378), (233, 56), 23, ['jamie'], 2),
         Row((3434, 2378), (45, 23), 23, ['hello'], 1),
         Row((3445, 2378), (76, 43), 23, ['hello'], 2),
         Row((7834, 2378), (90, 56), 24, ['hello'], 5),
]

Понимание списка может быть полезно для сопоставления / фильтрациишаг:

>>> # filter on x[1][5] and x[2]
>>> e = [r for r in d if r.Pair1[1]==x and r.Scalar0==23]
>>> e
[Row(Pair0=(732, 2378), Pair1=(233, 23), Scalar0=23, Names=['jamie'], Scalar1=7),
 Row(Pair0=(3434, 2378), Pair1=(45, 23), Scalar0=23, Names=['hello'], Scalar1=1)
]

Мне не ясно, что вы хотите сделать для шага, чтобы минимизировать суммы, но, надеюсь, этого ответа достаточно, чтобы приблизить вас к желаемому результату :-)

...