Qual é a maneira mais fácil de usar uma lista vinculada em python? No esquema, uma lista vinculada é definida simplesmente por '(1 2 3 4 5)
. As listas [1, 2, 3, 4, 5]
e as tuplas do Python (1, 2, 3, 4, 5)
não são, de fato, listas vinculadas e listas vinculadas têm algumas boas propriedades, como concatenação em tempo constante, e poder fazer referência a partes separadas delas. Torne-os imutáveis e eles são realmente fáceis de trabalhar!
python
linked-list
Claudiu
fonte
fonte
Respostas:
Aqui estão algumas funções de lista baseadas na representação de Martin v. Löwis :
Onde
w = sys.stdout.write
Embora as listas duplamente vinculadas sejam famosamente usadas na receita de conjuntos ordenada de Raymond Hettinger , as listas vinculadas individualmente não têm valor prático em Python.
Eu nunca usei uma lista isolada no Python para qualquer problema, exceto educacional.
Thomas Watnedal sugeriu um bom recurso educacional Como pensar como um cientista da computação, capítulo 17: Listas vinculadas :
Uma lista vinculada é:
um nó que contém um objeto de carga e uma referência a uma lista vinculada.
fonte
Para algumas necessidades, um deque também pode ser útil. Você pode adicionar e remover itens nas duas extremidades de uma deque com o custo O (1).
fonte
deque
seja um tipo de dados útil, não é uma lista vinculada (embora seja implementada usando uma lista duplamente vinculada no nível C). Portanto, ele responde à pergunta "o que você usaria em vez de listas vinculadas no Python?" e, nesse caso, a primeira resposta deve ser (para algumas necessidades) uma lista Python comum (também não é uma lista vinculada).linked_list[n]
) porque seria O (n). Retiradas da fila permitem e executam em O (1). No entanto, listas vinculadas, considerando um iterador na lista, podem permitir a inserção e remoção de O (1), enquanto que o deques não (é O (n), como um vetor). (Excepto na parte da frente e no final, em que ambos os deques e listas ligadas são ambos O (1) (apesar da fila de dupla extremidade é provável amortizado O (1) A lista ligada não é)...O(n)
). Se "quase todo caminho" permitir ignorar a diferença em O grande, sua declaração não terá sentido, pois poderíamos usar uma lista interna do Python como um deque se não fosse para pop (0), insira (0, v) grandes garantias de O .Eu escrevi isso outro dia
fonte
list_print()
.A resposta aceita é bastante complicada. Aqui está um design mais padrão:
É uma
LinkedList
classe simples baseada no design direto do C ++ e no Capítulo 17: Listas Vinculadas , conforme recomendado por Thomas Watnedal .fonte
X is None
é o preferido==
. stackoverflow.com/a/2988117/1740227insert
não é um caso específico do terceiro, para que você possa remover completamente aelif
cláusula?Listas imutáveis são melhor representadas através de duas tuplas, com Nenhuma representando NIL. Para permitir a formulação simples de tais listas, você pode usar esta função:
Para trabalhar com essas listas, prefiro fornecer toda a coleção de funções LISP (ou seja, primeira, segunda, enésima etc.), do que introduzir métodos.
fonte
Aqui está uma versão um pouco mais complexa de uma classe de lista vinculada, com uma interface semelhante aos tipos de sequência do python (ou seja, suporta indexação, fatia, concatenação com sequências arbitrárias etc.). Ele deve ter o prefixo O (1), não copia dados, a menos que precise e possa ser usado de maneira bastante intercambiável com tuplas.
Não será tão eficiente em termos de espaço ou tempo quanto as células lisp contras, pois as classes python são obviamente um pouco mais pesadas (você pode melhorar um pouco as coisas com "
__slots__ = '_head','_tail'
" " para reduzir o uso de memória). No entanto, ele terá as grandes características de desempenho O desejadas.Exemplo de uso:
Implementação:
fonte
llist - tipos de dados de lista vinculada para Python
O módulo llist implementa estruturas de dados de lista vinculada. Ele suporta uma lista duplamente vinculada, ou seja,
dllist
e uma estrutura de dados vinculada individualmentesllist
.objetos dllist
Este objeto representa uma estrutura de dados da lista duplamente vinculada.
first
Primeiro
dllistnode
objeto na lista.None
se a lista estiver vazia.last
Último
dllistnode
objeto na lista. Nenhuma se a lista estiver vazia.Os objetos dllist também oferecem suporte aos seguintes métodos:
append(x)
Adicione
x
ao lado direito da lista e retorne inseridodllistnode
.appendleft(x)
Adicione
x
ao lado esquerdo da lista e retorne inseridodllistnode
.appendright(x)
Adicione
x
ao lado direito da lista e retorne inseridodllistnode
.clear()
Remova todos os nós da lista.
extend(iterable)
Acrescente elementos de
iterable
no lado direito da lista.extendleft(iterable)
Anexe elementos do
iterable
lado esquerdo da lista.extendright(iterable)
Acrescente elementos de
iterable
no lado direito da lista.insert(x[, before])
Adicione
x
ao lado direito da lista, sebefore
não estiver especificado, ou insirax
no lado esquerdo dedllistnode before
. Retorno inseridodllistnode
.nodeat(index)
Nó de retorno (do tipo
dllistnode
) emindex
.pop()
Remova e retorne o valor de um elemento do lado direito da lista.
popleft()
Remova e retorne o valor de um elemento do lado esquerdo da lista.
popright()
Remova e retorne o valor de um elemento do lado direito da lista
remove(node)
Remover
node
da lista e retorne o elemento que estava armazenado nela.dllistnode
objetosclasse
llist.dllistnode([value])
Retorne um novo nó da lista duplamente vinculado, inicializado (opcionalmente) com
value
.dllistnode
objetos fornecem os seguintes atributos:next
Próximo nó na lista. Este atributo é somente leitura.
prev
Nó anterior na lista. Este atributo é somente leitura.
value
Valor armazenado neste nó. Compilado a partir desta referência
sllist
classe
llist.sllist([iterable])
Retorna uma nova lista isolada, inicializada com elementos deiterable
. Se iterável não for especificado, o novosllist
estará vazio.Um conjunto semelhante de atributos e operações é definido para este
sllist
objeto. Veja esta referência para mais informações.fonte
fonte
Baseei essa função adicional em Nick Stinemates
O método que ele tem adiciona o novo nó no começo, enquanto eu tenho visto muitas implementações que geralmente adicionam um novo nó no final, mas seja o que for, é divertido fazer isso.
fonte
A seguir, é o que eu criei. É semelhante ao de Riccardo C. , neste tópico, exceto que imprime os números em ordem, em vez de em sentido inverso. Também fiz do objeto LinkedList um Python Iterator para imprimir a lista como você faria em uma lista normal de Python.
fonte
Eu apenas fiz isso como um brinquedo divertido. Deve ser imutável, desde que você não toque nos métodos prefixados com sublinhado, e implementa um monte de magia Python, como indexação e
len
.fonte
Ao usar listas vinculadas imutáveis, considere usar a tupla do Python diretamente.
É realmente fácil, e você mantém as funções adicionais como len (ls), x em ls, etc.
fonte
fonte
Eu coloquei uma classe de lista vinculada do Python 2.xe 3.x em https://pypi.python.org/pypi/linked_list_mod/
Ele foi testado com o CPython 2.7, CPython 3.4, Pypy 2.3.1, Pypy3 2.3.1 e Jython 2.7b2 e vem com um bom conjunto de testes automatizados.
Também inclui classes LIFO e FIFO.
Eles não são imutáveis embora.
fonte
fonte
Classe de lista vinculada
Uso
Resultado
fonte
Aqui está minha implementação simples:
Resultado:
fonte
Aqui está a minha solução:
Implementação
Uso
Ideia original de implementação
fonte
Penso que a implementação abaixo preenche o projeto com bastante graciosidade.
fonte
fonte
Primeiro de tudo, suponho que você queira listas vinculadas. Na prática, você pode usar
collections.deque
, cuja implementação atual do CPython é uma lista duplamente vinculada de blocos (cada bloco contém uma matriz de 62 objetos de carga). Ele consome a funcionalidade da lista vinculada. Você também pode procurar por uma extensão C chamadallist
pypi. Se você deseja uma implementação em Python pura e fácil de seguir da lista vinculada ADT, pode dar uma olhada na minha implementação mínima a seguir.fonte
Amostra de uma lista duplamente vinculada (salve como linkedlist.py):
Teste (salve como test.py):
Saída :
fonte
Também escrevi uma Lista Vinculada Única com base em algum tutorial, que possui as duas classes básicas de Nó e Lista Vinculada e alguns métodos adicionais para inserção, exclusão, reversão, classificação e outros.
Não é o melhor ou o mais fácil, mas funciona bem.
fonte
Expandindo a resposta de Nick Stinemates
fonte
Meus 2 centavos
fonte
fonte
minha lista vinculada dupla pode ser compreensível para noobies. Se você está familiarizado com o DS em C, isso é bastante legível.
Embora muitas outras simplificações possam ser adicionadas a esse código, pensei que uma implementação bruta me tornaria mais fácil de entender.
fonte
Se você deseja apenas criar uma lista simples de gostos, consulte este código
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10]]]]]]]]]]]]]
para visualizar a execução deste bacalhau Visite http://www.pythontutor.com/visualize.html#mode=edit
fonte