Сортировка и доступ к кортежам в списках по элементу по заданному индексу - PullRequest
1 голос
/ 09 мая 2020

У меня есть список, и я хотел бы отсортировать кортежи в списке на основе второго индекса.

data = [[(7, -1), (8, 10), (9, 5), (10, 0.1), (11, -0.4)], [(7, -3), (8, -1), (9, 2), (10, 0.4), (11, -0.2)]]

sorted_by_second = sorted(data, key=lambda tup: tup[1])

print(sorted_by_second)

, что приводит к:

[[(7, -3), (8, -1), (9, 2), (10, 0.4), (11, -0.2)], [(7, -1), (8, 10), (9, 5), (10, 0.1), (11, -0.4)]]

Но я пытаюсь чтобы получить:

[[(7, -1), (11, -0.4), (10, 0.1), (9, 5), (8, 10)], [(7, -3), (8, -1), (11, -0.2), (10, 0.4), (9, 2)]]

И я также хочу извлечь ячейки для особого условия:

  1. , когда второй индекс в ячейках равен -1

Возьмите [(7, -1), (8, 10), (9, 5), (10, 0.1), (11, -0.4)], например, (7, -1) - это тот, который мне нужен.

, когда значения второго индекса являются наименьшими и вторыми наименьшими.

Возьмем, например, [(7, -1), (8, 10), (9, 5), (10, 0.1), (11, -0.4)], после сортировки -> [(7, -1), (11, -0.4), (10, 0.1), (9, 5), (8, 10)] -> ясно видно, что для второго индекса в кортежи 0,1 и 5 - это наименьшие и вторые наименьшие положительные значения. Поэтому (10, 0.1), (9, 5) - это то, что я хочу.

Как:

[[(7, -1), (10, 0.1), (9, 5)], [(8, -1), (10, 0.4), (9, 2)]]

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Ваша попытка сортировки не удалась, потому что у вас есть список списков, поэтому вы ссылались на внутренние списки, говоря tuple. Вам нужно go еще на один уровень вниз, а затем выполнить сортировку, например:

data = [
    [(7, -1), (8, 10), (9, 5), (10, 0.1), (11, -0.4)],
    [(7, -3), (8, -1), (9, 2), (10, 0.4), (11, -0.2)]
]
sorted_by_second = [sorted(l, key = lambda tup: tup[1]) for l in data]
print(sorted_by_second)

Для второй части вашего вопроса вы ищете filter. Сначала определите условия: второй индекс должен быть либо -1, либо больше 0. Затем мы можем просто выбрать первые 3 значения из результата.

filtered = [list(filter(lambda tup: tup[1] == -1 or tup[1] > 0, l))[: 3]
    for l in sorted_by_second
]
print(filtered)
[[(7, -1), (10, 0.1), (9, 5)], [(8, -1), (10, 0.4), (9, 2)]]
1 голос
/ 09 мая 2020

Ваш список на самом деле является списком списков, поэтому вам нужно будет отсортировать каждый подсписок:

data = [[(7, -1), (8, 10), (9, 5), (10, 0.1), (11, -0.4)], [(7, -3), (8, -1), (9, 2), (10, 0.4), (11, -0.2)]]
sorted_by_second = [sorted(x, key=lambda tup: tup[1]) for x in data]
sorted_by_second

[[(7, -1), (11, -0.4), (10, 0.1), (9, 5), (8, 10)],
  [(7, -3), (8, -1), (11, -0.2), (10, 0.4), (9, 2)]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...