сортировать элементы по разнице - PullRequest
0 голосов
/ 28 января 2019

говорят, что у меня есть список людей разного возраста int и дохода int, и я хочу отсортировать их следующим образом:

people = [(25, 10000), (45, 22000), (20, 11000), (26, 13000), (27, 11000)]

people_new = [(20, 11000), (25, 10000), (27, 11000), (26, 13000), (45, 22000)]

Первая сортировка по возрастам.Во-вторых, те, чей возраст ближе всего друг к другу (т.е. разница в возрасте между людьми <= 2), располагаются в порядке доходов.Возраст не так важен, если они близки по разнице. </p>

Можно ли это сделать с помощью функции sorted в списках?

Если я напишу: people_new = sorted(people, key = lambda t: (t[0],t[1]))Человек с 27 лет не в порядке, поэтому это будет неправильно.

[(20, 11000), (25, 10000), (26, 13000), (27, 11000) , (45, 22000)]

Нужно ли писать новую функцию?Если да, то есть ли короткий питонский способ сделать это?

Редактировать: В возрасте близко Я имею в виду <= 2 из последнего возраста, который был добавлен вправильно отсортированный список.можно добавить возраст 20, но поскольку нет 21 или 22, тогда 25 становится началом следующей группы и 25, 26, 27, ... будут рассматриваться.Если бы были включены все возрасты 25 - 45 лет, то это была бы одна группа. </p>

1 Ответ

0 голосов
/ 28 января 2019

Мы можем работать с тем, что вы предоставили.

people = [(25, 10000), (45, 22000), (20, 11000), (26, 13000), (27, 11000)]

people_by_age = sorted(people, key = lambda t: (t[0], t[1]))
# [(20, 11000), (25, 10000), (26, 13000), (27, 11000), (45, 22000)]

N = len(people_by_age)

for i,_ in enumerate(people_by_age):

    # For all but the last person.
    if i+1 < N:

        # If the current and next persons have a close age.
        if abs(people_by_age[i][0] - people_by_age[i+1][0]) <= 2: 

            # Swap their position in the list based on income.
            if people_by_age[i][1] < people_by_age[i+1][1]:
                temp = people_by_age[i]
                people_by_age[i] = people_by_age[i+1]
                people_by_age[i+1] = temp

print(people_by_age) # by age and income.
# [(20, 11000), (26, 13000), (27, 11000), (25, 10000), (45, 22000)]

Если вы считаете, что добавление i+1<N раздражает, вы также можете написать код, чтобы он игнорировал ошибку IndexError, которую мы получим в конце.Это немного менее очевидно, хотя.

for i,_ in enumerate(people_by_age):

    try:      
        ...        
    except IndexError:
        break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...