【问题标题】:Pythonic way to split a list into first and rest?Pythonic 方法将列表拆分为第一个和休息?
【发布时间】:2011-03-31 15:32:18
【问题描述】:

我认为在 Python 3 中我可以做到:

first, *rest = l

这正是我想要的,但我使用的是 2.6。现在我正在做:

first = l[0]
rest = l[1:]

这很好,但我只是想知道是否有更优雅的东西。

【问题讨论】:

标签: python list split python-2.x


【解决方案1】:

如果lstring 类型我建议:

first, remainder = l.split(None, maxsplit=1)

【讨论】:

  • list 没有 .split() 方法。
  • 哎呀!我的错误,虽然它是一个字符串
  • 仍然 +1,虽然在这种情况下它是错误的,但这是一件好事,因为我想拆分字符串并将头部 + 其余结果分配给不同的变量。
  • 请注意,如果拆分仅返回 1 个项目的列表,则会引发错误
【解决方案2】:

还有一个,使用 python 2.7。只需使用中间功能。合乎逻辑,因为新行为模仿了函数参数传递所发生的情况。

li = [1, 2, 3]
first, rest = (lambda x, *y: (x, y))(*li)

【讨论】:

    【解决方案3】:

    你可以的

    first = l.pop(0)
    

    然后l 将是其余的。不过,它会修改您的原始列表,因此可能不是您想要的。

    【讨论】:

    • 这不适用于空列表:x = []; x.pop(0) Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: pop from empty list
    • @avyfain:OP 的 Python3 示例都不会。 first, *rest = [] 引发 ValueError。
    【解决方案4】:
    first, rest = l[0], l[1:]
    

    基本相同,只是它是单线器。元组分配岩石。

    这有点长而且不太明显,但适用于所有可迭代对象(而不是仅限于可切片对象):

    i = iter(l)
    first = next(i) # i.next() in older versions
    rest = list(i)
    

    【讨论】:

    • 更好的是:first, last = l[:1], l[1:],以防 l 为空(而且它更漂亮;)。
    • 应该提到这些在语义上并不相同:l[:1] 是一个列表,l[0] 是列表的一个元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 2017-11-02
    • 2019-09-03
    • 2021-05-23
    相关资源
    最近更新 更多