成对嵌套列表的大多数pythonic(和有效)方式

Posted

技术标签:

【中文标题】成对嵌套列表的大多数pythonic(和有效)方式【英文标题】:Most pythonic (and efficient) way of nesting a list in pairs 【发布时间】:2012-08-03 02:47:55 【问题描述】:

我的清单是:

mylist=[1,2,3,4,5,6]

我想将 mylist 转换为对列表:

[[1,2],[3,4],[5,6]]

有这样做的pythonic方式吗?列表理解?迭代工具?

【问题讨论】:

【参考方案1】:

是的,列表理解是我通常的做法:

>>> groupsize = 2
>>> [mylist[x:x+groupsize] for x in range(0,len(mylist),groupsize)]
[[1,2],[3,4],[5,6]]
>>> groupsize = 3
>>> [mylist[x:x+groupsize] for x in range(0,len(mylist),groupsize)]
[[1,2,3],[4,5,6]]

我使用range 是为了便于移植,如果您使用的是python 2(您可能是),请将range 更改为xrange 以节省内存。

【讨论】:

【参考方案2】:

我的首选技术:

>>> mylist = [1, 2, 3, 4, 5, 6]
>>> mylist = iter(mylist)
>>> zip(mylist, mylist)
[(1, 2), (3, 4), (5, 6)]

无论如何,我通常使用生成器而不是列表,因此通常不需要第 2 行。

【讨论】:

为了增加乐趣,请将 zip 更改为 zip(*[mylist]*groupsize) 以允许通用组大小。当然,zip 方式在处理长度不能被所需组大小整除的列表时总是会遇到问题。 这似乎是“最pythonic”的方式。 @BrianM.Hunt 我不知道我会同意这一点。 python 的禅宗说“简单胜于复杂”,如果您不完全了解 zip 和迭代器的工作原理,那几乎不能称为简单。不过,这无疑是最聪明的方法。 @Josiah 我有点同意你的看法,尽管如果可以将两个不同的生成器压缩在一起,那么就知道他们可以按顺序将生成器与自身压缩。我发现这种技术相当安全。特别是如果你要在 zip(points, points) 中寻找 (x, y),例如它可能很明显【参考方案3】:

另一种方式:

zip( mylist[:-1:2], mylist[1::2] )

这会产生一个元组列表:

>>> zip(mylist[:-1:2],mylist[1::2])
[(1, 2), (3, 4), (5, 6)]

如果你真的想要一个列表列表:

map(list, zip(mylist[:-1:2],mylist[1::2]))

【讨论】:

【参考方案4】:

查看itertools documentation中的“石斑鱼”食谱:

def grouper(n, iterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

【讨论】:

-1。这将在 6 项序列上给出 5 对,这是不正确的。如果你想要一个 itertools 配方,它应该是grouper【参考方案5】:

[mylist[2*n:2*n+2] for n in xrange(len(mylist)/2)]

此解决方案结合使用列表推导和切片从原始列表中按顺序提取对,并构建切片列表。

或者,[mylist[n:n+2] for n in xrange(0, len(mylist), 2)] 是相同的,除了 xrange 按二进制而不是切片计数。感谢 Steven Rumbalski 的建议。

现在完全不同:这是一个解决方案 (ab),使用 zip 和一个临时函数而不是中间赋值:

>>> (lambda i: zip(i, i))(iter(mylist))
[(1, 2), (3, 4), (5, 6)]

【讨论】:

比它需要的更复杂 - 只需将 xrange 步进 2,大部分数学运算就消失了。

以上是关于成对嵌套列表的大多数pythonic(和有效)方式的主要内容,如果未能解决你的问题,请参考以下文章

将 CSV 值读入列表字典的大多数 Pythonic 方式

python:以灵活的方式处理深度嵌套数据的有效技术是啥?

在 Python 中以列表(循环方式)迭代对

如何使用python查找成对的卡片包列表

Python 列表嵌套多种实现方式

数组或列表中元素的Python成对比较