Python - внесение изменений в значения max / min списка кортежей - PullRequest
0 голосов
/ 28 октября 2018

У меня есть следующий список (x,y) кортежей:

[(0, 0), (36, 0), (0, 36), (4, 19), (19, 4), (36, 36)]

Кортежи с наименьшим x Я бы хотел перебрать x+1, а кортежи с наименьшим y Я бынравится повторять y+1.Это должно привести к следующему:

[(1, 1), (36, 1), (1, 36), (4, 19), (19, 4), (36, 36)]

Поскольку самые маленькие x и y оба равны 0, мы меняем их на 0+1.

Аналогично, я хочу сделатьаналогичная вещь для самых больших x и y => самых больших x должна измениться на x-1, а самая большая y должна измениться на y-1.

Окончательный результат после выполнения этих двух изменений должен быть:

[(1, 1), (35, 1), (1, 35), (4, 19), (19, 4), (35, 35)]

Каким будет наиболее эффективный способ выполнения этого?Я буду работать со списками, содержащими более 1000+ элементов, поэтому ключевым моментом является эффективность времени.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Каким будет самый эффективный способ выполнения этого?

Это хороший пример, когда, если вы можете использовать стороннюю библиотеку, векторизованные операцииполезныНапример, используя Pandas, вы можете использовать логическое индексирование со столбцом:

import pandas as pd

L = [(0, 0), (36, 0), (0, 36), (4, 19), (19, 4), (36, 36)]

df = pd.DataFrame(L)

for col in df:
    df.loc[df[col].eq(df[col].min()), col] += 1

print(list(map(tuple, df.values)))

[(1, 1), (36, 1), (1, 36), (4, 19), (19, 4), (36, 36)]

При этом ~ 1000 элементов - это относительно небольшое число, поэтому гарантии нет1013 * структурные издержки Pandas будут компенсированы преимуществами векторизации.

0 голосов
/ 28 октября 2018

Сначала найдите минимальные значения x и y.

>>> lst = [(0, 0), (36, 0), (0, 36), (4, 19), (19, 4), (36, 36)]
>>> min_x = min(x for x, y in lst)
>>> min_y = min(y for x, y in lst)
>>> min_x
>>> 0
>>> min_y
>>> 0

Затем выполните итерации по lst и добавьте 1 к каждой координате, равной их соответствующему минимальному значению.

>>> lst = [(x + (x == min_x), y + (y == min_y)) for x, y in lst]
>>> lst
>>> [(1, 1), (36, 1), (1, 36), (4, 19), (19, 4), (36, 36)]

Обратите внимание, что добавление True к числу добавляет 1, добавление False к номеру добавляет ноль, например:

>>> 36 + True
>>> 37
>>> 36 + False
>>> 36

Вы можете продолжить аналогичным образом для второй части вашеговопрос, используя встроенную max.

...