【问题标题】:Compiling a list : python best practice编译列表:python 最佳实践
【发布时间】:2019-07-10 02:44:27
【问题描述】:

我经常在 python 3 中一次编译一个元素的列表;比如说我通过一个带有第一个元素 head 的链表来制作一个列表:

l = []
while head:
    l.append(head.val)
    head = head.next

我想知道最佳实践是什么。有没有另一种写法?是否可以在一行中描述列表,而不是这样:

while head:
    l = # something creating the list AND appending elements
    head = head.next

更好的是:在类似情况下我是否总是必须使用循环来创建列表,或者是否经常有方法可以在一行中创建所需的列表?

谢谢!

编辑:代码中的错字!

【问题讨论】:

  • 是的。查看列表推导!你可以做很复杂的事情,比如[i for i in range(10) if i % 2 == 0]google上的第一个教程:hackernoon.com/list-comprehension-in-python-8895a785550b
  • @Reedinationer:列表推导有其局限性——Python 3.8 的主要变化之一将是能够在表达式中进行赋值,并且大部分目的是让列表推导更强大.对我来说,如何通过理解来解决提问者的问题并不明显(不使用为此目的创建的函数)。
  • 您是否经常使用自己的定制链表?
  • @juanpa.arrivillaga 是的,它们的公式与 Olivier Melançon 的回答中所写的一样
  • @Jeffery 请问为什么?他们提供了什么标准库没有提供的东西?例如只是香草listcollections.deque

标签: python python-3.x list append


【解决方案1】:

从 OOP 的角度来看,最佳实践是依靠 Python 的 __iter__ 方法将可迭代对象强制转换为 list

我假设你的链表class 看起来有点像这样。

class LinkedList:
    def __init__(self, value, nxt=None):
        self.value = value
        self.next = nxt

要允许对您的链表进行迭代,您可以定义__iter__

class LinkedList:
    def __init__(self, value, nxt=None):
        self.value = value
        self.next = nxt

    def __iter__(self):
        while self:
            yield self.value
            self = self.next

然后您可以让list 处理LinkedList 可迭代的演员表。

head = LinkedList(1, LinkedList(2, LinkedList(3)))
lst = list(head) # [1, 2, 3]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 2012-02-19
    • 2015-09-22
    • 2015-03-14
    相关资源
    最近更新 更多