17

コンマ区切りの値をペアに分割したい:

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

# Pythonicはどのように見えるでしょうか?

奇数セットの文字列をどのように検出して処理しますか?

4

5 に答える 5

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

アイテム数が奇数の場合、最後の要素は無視されます。完全なペアのみが含まれます。

于 2009-05-15T20:15:55.817 に答える
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',)]

PS私はこのコードを隠しておいて、どこから入手したのか気づきました。これについて、stackoverflowには2つの非常によく似た質問があります。

のレシピセクションからこの宝石もありますitertools

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)
于 2009-05-15T20:16:32.070 に答える
8

イテレータでも機能し、任意の数のアイテムを組み合わせることができる、より一般的なオプションです。

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

リストの代わりに遅延反復子を取得する場合は、zip を itertools.izip に置き換えます。

于 2009-05-15T20:29:28.873 に答える
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」と見なされます。

于 2009-09-15T21:53:29.300 に答える
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))

izip_longestはPython2.6で使用できます。

于 2009-05-15T20:20:54.447 に答える