これを分割する最も良い方法は何ですか:
tuple = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')
これに:
tuples = [('a', 'b'), ('c', 'd'), ('e', 'f'), ('g', 'h')]
入力が常に偶数の値を持っていると仮定します。
これを分割する最も良い方法は何ですか:
tuple = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')
これに:
tuples = [('a', 'b'), ('c', 'd'), ('e', 'f'), ('g', 'h')]
入力が常に偶数の値を持っていると仮定します。
zip()
あなたの友だちです:
t = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')
zip(t[::2], t[1::2])
[(tuple[a], tuple[a+1]) for a in range(0,len(tuple),2)]
または、itertools
(のレシピを参照grouper
)を使用します。
from itertools import izip
def group2(iterable):
args = [iter(iterable)] * 2
return izip(*args)
tuples = [ab for ab in group2(tuple)]
私は、 dfaのコメントへの応答として、 PeterHoffmannの回答に基づいてこのコードを提示します。
タプルに偶数の要素があるかどうかに関係なく、動作することが保証されています。
[(tup[i], tup[i+1]) for i in range(0, (len(tup)/2)*2, 2)]
(len(tup)/2)*2
rangeパラメーターは、タプルの長さ以下の最大の偶数を計算するため、タプルに偶数の要素があるかどうかに関係なく機能することが保証されます。
メソッドの結果はリストになります。これは、関数を使用してタプルに変換できますtuple()
。
サンプル:
def inPairs(tup):
return [(tup[i], tup[i+1]) for i in range(0, (len(tup)/2)*2, 2)]
# odd number of elements
print("Odd Set")
odd = range(5)
print(odd)
po = inPairs(odd)
print(po)
# even number of elements
print("Even Set")
even = range(4)
print(even)
pe = inPairs(even)
print(pe)
出力
奇数セット [0、1、2、3、4] [(0、1)、(2、3)] セットでも [0、1、2、3] [(0、1)、(2、3)]
常に2であるとは限らない場合は、任意のサイズのチャンクの一般的なレシピを次に示します。
def chunk(seq, n):
return [seq[i:i+n] for i in range(0, len(seq), n)]
chunks= chunk(tuples, 2)
または、イテレータを楽しむ場合:
def iterchunk(iterable, n):
it= iter(iterable)
while True:
chunk= []
try:
for i in range(n):
chunk.append(it.next())
except StopIteration:
break
finally:
if len(chunk)!=0:
yield tuple(chunk)