将逗号分隔的数字按对拆分的Pythonic方法

17 投票
5 回答
7145 浏览
提问于 2025-04-15 11:37

我想把用逗号分隔的值分成一对一对的:

>>> s = '0,1,2,3,4,5,6,7,8,9'
>>> pairs = # something pythonic
>>> pairs
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]

那么,# 有点像Python的写法会是什么样子的呢?

你会如何检测并处理一个包含奇数个数字的字符串呢?

5 个回答

8

这里有一个更通用的选项,它不仅适用于迭代器,还可以组合任意数量的项目:

 def n_wise(seq, n):
     return zip(*([iter(seq)]*n))

如果你想要一个懒惰的迭代器而不是一个列表,可以把zip换成itertools.izip。

8

这样做怎么样:

>>> x = '0,1,2,3,4,5,6,7,8,9'.split(',')
>>> def chunker(seq, size):
...     return (tuple(seq[pos:pos + size]) for pos in xrange(0, len(seq), size))
...
>>> list(chunker(x, 2))
[('0', '1'), ('2', '3'), ('4', '5'), ('6', '7'), ('8', '9')]

这个方法也能很好地处理不均匀的数量:

>>> x = '0,1,2,3,4,5,6,7,8,9,10'.split(',')
>>> list(chunker(x, 2))
[('0', '1'), ('2', '3'), ('4', '5'), ('6', '7'), ('8', '9'), ('10',)]

顺便说一下,我之前把这段代码藏起来了,现在才意识到我从哪里得到的。StackOverflow上有两个非常相似的问题:

还有这个来自 itertools 的“宝藏”代码:

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)
44

类似这样的:

zip(t[::2], t[1::2])

完整的例子:

>>> s = ','.join(str(i) for i in range(10))
>>> s
'0,1,2,3,4,5,6,7,8,9'
>>> t = [int(i) for i in s.split(',')]
>>> t
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> p = zip(t[::2], t[1::2])
>>> p
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]
>>>

如果项目的数量是奇数,最后一个元素会被忽略。只有完整的一对会被包含在内。

撰写回答