2016-04-10 11 views
7

私はいくつかの要素のリストを持っています。 [1, 2, 3, 4]と単一のオブジェクト、例えば。 'a'。私はリストの要素が第1の位置にあり、単一のオブジェクトが第2の位置にあるタプルのリストを生成したい:[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]Python:1つの要素を持つzipリスト

私はこのようなzipでそれを行うことができます:

def zip_with_scalar(l, o): # l - the list; o - the object 
    return list(zip(l, [o] * len(l))) 

しかし、これは私の作成の感覚や要素を繰り返すの不要なリストを提供します。

もう一つの可能​​性は確かに非常にきれいで、神託である

def zip_with_scalar(l, o): 
    return [(i, o) for i in l] 

ですが、ここで私は、「手動」全体のことを行います。 Haskellでは私は

zipWithScalar l o = zip l $ repeat o 

のようなものは、任意の組み込み関数やトリックはどちらか、スカラーまたは普通郵便番号を使用するように私を可能にする何かをビュンすなわちソートの無限のリストについては、あるのだろうか?

+3

https://docs.python.org/3/library/itertools.html#itertools.repeat – jonrsharpe

+0

言ったが、また、あなたはおそらくしたいjonrsharpe通常の関数ではなくジェネレータとして書き直してください。 – OmnipotentEntity

+3

@OmnipotentEntity OPが3.xを使用しているので、単にzip(l、repeat(o))を返すことができます。それは反復子であり、「収穫」する必要はありません。 – jonrsharpe

答えて

11

これはあなたのHaskellのソリューションにcloestです:

import itertools 

def zip_with_scalar(l, o): 
    return zip(l, itertools.repeat(o)) 

あなたはまた、内包が行うようにリストを作成しないように発電機を、使用することができます

def zip_with_scalar(l, o): 
    return ((i, o) for i in l) 
2

あなたはまたしてzip_longestを使用することができます塗りつぶし値はo

from itertools import zip_longest 

def zip_with_scalar(l, o): # l - the list; o - the object 
    return zip_longest(l, [o], fillvalue=o) 

print(list(zip_with_scalar([1, 2, 3, 4] ,"a"))) 

oに使用される任意の変更可能な値は、zip_longestまたはrepeatのどちらを使用してもコピーされません。

3

あなたは組み込みのmap機能を使用することができます:あなたはちょうど*

elements = [1, 2, 3, 4] 
single_object = 'a' 

zip(elements, single_object * len(elements)) 
0

を。

from itertools import cycle 


def zip_with_scalar(l, o): 
    return zip(i, cycle(o)) 

デモ:

>>> from itertools import cycle 
>>> l = [1, 2, 3, 4] 
>>> list(zip(l, cycle('a'))) 
[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')] 
+0

を示しています。単一オブジェクトが1要素のみのシーケンスであれば、たとえば数字です。そして、OPはすでに何かを似ています – Copperfield

+0

これは基本的にOPが与えた最初のソリューションではありませんか? – refi64

1

これはitertools.cycleクラスのための完璧な仕事であると多くを行うことができます

>>> elements = [1, 2, 3, 4] 
>>> key = 'a' 
>>> map(lambda e: (e, key), elements) 
[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')] 
+0

'' cycle''への引数は反復可能でなければなりませんか?それは文字列であるので '' 'a''で動作しますが、任意のオブジェクトでは動作しません。 – zegkljan

+0

@zegkljanはいiterableでなければなりません。 – styvane

0
lst = [1,2,3,4] 
tups = [(itm, 'a') for itm in lst] 
tups 

> [(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')] 
関連する問題