Pythonic方式将逗号分隔数字分成对

时间:2009-05-15 20:10:32

标签: python tuples

我想将逗号分隔值拆分成对:

>>> 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)]

#something pythonic 会是什么样的?

你如何检测和处理一组奇数的字符串?

5 个答案:

答案 0 :(得分: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)]
>>>

如果项目数为奇数,则忽略最后一个元素。只包括完整的配对。

答案 1 :(得分: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',)]

P.S。我把这个代码藏起来了,我才意识到我从哪里得到它。 stackoverflow中有两个非常相似的问题:

itertools的{​​{3}}部分还有这个宝石:

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

答案 2 :(得分:8)

更通用的选项,它也适用于迭代器,并允许组合任意数量的项目:

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

如果你想获得一个懒惰的迭代器而不是列表,请用itertools.izip替换zip。

答案 3 :(得分:4)

与FogleBirds类似的解决方案,但使用迭代器(生成器表达式)而不是列表推导。

s = '0,1,2,3,4,5,6,7,8,9'
# generator expression creating an iterator yielding numbers
iterator = (int(i) for i in s.split(','))

# use zip to create pairs
# (will ignore last item if odd number of items)
# Note that zip() returns a list in Python 2.x, 
# in Python 3 it returns an iterator
pairs = zip(iterator, iterator)

列表推导和生成器表达式都可能被认为是非常“pythonic”。

答案 4 :(得分:2)

这将忽略奇数列表中的最后一个数字:

n = [int(x) for x in s.split(',')]
print zip(n[::2], n[1::2])

这会将较短的列表填入奇数列表中的0:

import itertools
n = [int(x) for x in s.split(',')]
print list(itertools.izip_longest(n[::2], n[1::2], fillvalue=0))
Python 2.6中提供了

izip_longest