4
>>> a=["a"]*4
>>> a
['a', 'a', 'a', 'a']
>>> b=range(4)
>>> b
[0, 1, 2, 3]
>>> c = [range(4,8), range(9,13), range(14,18), range(19,23)]
>>> c
[[4, 5, 6, 7], [9, 10, 11, 12], [14, 15, 16, 17], [19, 20, 21, 22]]
>>>
>>> result = map(lambda x,y:[x,y],a,b)
>>> map(lambda x,y:x.extend(y),result,c)
>>> result = map(tuple, result)
>>> result     # desired output: 
[('a', 0, 4, 5, 6, 7), ('a', 1, 9, 10, 11, 12), ('a', 2, 14, 15, 16, 17), ('a', 3, 19, 20, 21, 22)]
>>>
>>> try_test = zip(a,b,c)
>>> try_test # NOT DESIRED: leaves me with the list within the tuples
[('a', 0, [4, 5, 6, 7]), ('a', 1, [9, 10, 11, 12]), ('a', 2, [14, 15, 16, 17]), ('a', 3, [19, 20, 21, 22])]

誰かが「結果」を行うためのより簡潔な方法を持っているかどうか疑問に思いましたか?

4

3 に答える 3

6

あなたはこのようなことを試すことができます:

result = [tuple([ai, bi] + ci) for ai, bi, ci in zip(a, b, c)]
于 2012-09-29T17:51:19.153 に答える
2

この問題への完全に一般的なアプローチについては、ここにある多くのバリエーションの1つを使用することを検討してflattenください。ここで、flattenは、任意にネストされた反復可能オブジェクトを取得し、そこに含まれるアイテムのフラットリストを返す関数です。

flatten次に、のzip値をマップして、a, b, cタプルに変換します。

>>> from collections import Iterable
>>> def flatten(l):
...     for i in l:
...         if isinstance(i, Iterable) and not isinstance(i, basestring):
...             for sub in flatten(i):
...                 yield sub
...         else:
...             yield i
...
>>> map(tuple, map(flatten, zip(a, b, c)))
[('a', 0, 4, 5, 6, 7), ('a', 1, 9, 10, 11, 12), 
 ('a', 2, 14, 15, 16, 17), ('a', 3, 19, 20, 21, 22)]

または、さらに簡潔にflatten、任意の引数リストを受け入れてタプルを返すように変更します。次に必要なのはmap

>>> def flat_tuple(*args):
...     return tuple(flatten(args))
... 
>>> map(flat_tuple, a, b, c)
[('a', 0, 4, 5, 6, 7), ('a', 1, 9, 10, 11, 12), 
 ('a', 2, 14, 15, 16, 17), ('a', 3, 19, 20, 21, 22)]

これが1回限りの問題である場合、上記のアプローチはおそらくそれが価値があるよりも厄介です。flattenただし、他の目的ですでに定義している場合、またはこれを頻繁に行う場合は、上記の方法で多くの問題を回避できます。

それ以外の場合は、楽しみのために、ここに私が好きなnneonneoの答えのバリエーションがあります:

>>> [x + tuple(y) for x, y in zip(zip(a, b), c)]
[('a', 0, 4, 5, 6, 7), ('a', 1, 9, 10, 11, 12), 
 ('a', 2, 14, 15, 16, 17), ('a', 3, 19, 20, 21, 22)]
于 2012-09-29T18:29:28.250 に答える
-2

この場合:(簡潔な==短い場合)

q = lambda x : tuple(range(x,x+4))
res = [ ('a', num) + q(4*(num+1)+num) for num in xrange(4) ]
于 2012-09-29T18:00:25.497 に答える