Как передать объект с атрибутом Value в функцию Python - PullRequest
0 голосов
/ 08 октября 2019

Я работал над сортировкой, но я не могу вызвать функцию определенным образом.

По сути, я хочу создать функцию, которая принимает списокОбъект Node с атрибутом Value и возвращает список с элементами из исходного списка, сохраненными в подсписках. Элементы с одинаковым значением должны быть в одном и том же подсписке и отсортированы в порядке убывания.

Для продолжения кода я хочу знать, каким должен быть параметр этого.

def advanced_sort(<What will come here according to the call>):

Вызов функции:

advanced_sort([Node(1), Node(2), Node(1),Node(2)])

Может кто-нибудь помочь мне с кодом? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 08 октября 2019

advanced_sort принимает один аргумент: список (или, возможно, произвольную итерацию). Таким образом, подпись имеет только один аргумент:

def advanced_sort(nodes):

Игнорируя подсказки типа, подпись не имеет и не может отражать внутреннюю структуру одного аргумента;это просто имя для обозначения переданного значения внутри тела функции.

Внутри тела вы можете написать код, который предполагает , что nodesсписок, и далее каждый элемент списка является экземпляром Node, так что вы можете сделать что-то вроде принятия каждого значения в качестве атрибута Value.

def advanced_sort(nodes):
    # If nodes is iterable, then x refers to a different
    # element of the iterable each time through the loop.
    for x in nodes:
        # If nodes is a list of Node instances, then
        # x is a Node instance, and thus you can access
        # its Value attribute in the normal fashion.
        print("Found value {}".format(x.Value))

Предполагая определение Node подобно

class Node:
    def __init__(self, v):
        self.Value = v

приведенное выше определение advanced_sort даст следующий результат:

>>> advanced_sort([Node(3), Node(2), Node(1),Node(2)])
Found value 1
Found value 2
Found value 3
Found value 4
1 голос
/ 08 октября 2019

Аргумент - это один итеративный объект, такой как список, кортеж, набор, ...

Затем вы выполняете итерации по элементам, как в ответе Чепнера.

Например, выможно использовать словарь для группировки узлов по значению:

def advanced_sort(node_list): 
    ret = dict() 
    for node in node_list: 
        if node.value not in ret.keys(): 
            ret[node.value] = list() 
        ret[node.value].append(node)

     return [ret[value] for value in sorted(ret.keys(), reverse=True)] #descending order
advanced_sort([Node(3), Node(2), Node(1),Node(1)])
>>> [[Node(3)], [Node(2)], [Node(1),Node(1)]] 
0 голосов
/ 08 октября 2019

Можете ли вы внести изменения в класс Node? В этом случае вы можете сделать что-то вроде этого:

from functools import total_ordering


@total_ordering
class Node:

    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        if not isinstance(other, Node):
            return NotImplemented
        return self.value == other.value

    def __lt__(self, other):
        if not isinstance(other, Node):
            return NotImplemented
        return self.value < other.value

    def __str__(self):
        return f"({self.value})"


def main():

    from itertools import groupby


    nodes = [Node(1), Node(2), Node(1), Node(2)]
    nodes_sorted = sorted(nodes, reverse=True)
    nodes_sublists = [list(group) for key, group in groupby(nodes_sorted)]

    for sublist in nodes_sublists:
        print(*map(str, sublist))

    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

Вывод:

(2) (2)
(1) (1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...