0

以前の質問を二重にして申し訳ありませんが、問題を解決する特定のデータを尋ねると思いました。この結果が欲しい

tuple_of_vars = (item for _, item for zip(tuple_of_vars, new_vals_generator))

これは不可能なので

a, b, c, d = (val for val in infite_generator)

実際には、私は一行でやりたい

for var in var_list:
    var = next(infinite_generator)

割り当ての左側に変数の数のメタ情報を取得するためのインタープリター フックはありますか? この最後のコードを自動的に実行できる方が良いでしょう(変数インデックスとステップを持つスライスである左側のケースを含む)

また、割り当ての左側にある変数のジェネレーターを作成する方法もあります。

編集:これは Python3 で停止しません:

def incr(a):
    while True:
        yield a
        a += 1


a = [None for i in range(20)]

a[3:3:3], *_ = incr(1)

print(a)

と同じ:

a,b,c,d, *_ = incr(1)

print(a, b, c, d)

スライスもありません (実際には、インデックスは変数になります。これは単なるテストです)。islice などは承知していますが、遅すぎます。

これもエラーを生成します:

a = 1000*[True]

bound = int(len(a) ** 0.5)

for i in range(3, bound, 2):
    a[3::i], *x = [[False] for _ in range(bound)]

""" Error:
ValueError: attempt to assign sequence of size 1 to extended slice of size 333
"""

この:

a = 1000*[True]

bound = int(len(a) ** 0.5)

for i in range(3, bound, 2):
    a[3::i], *x = [False] * bound

""" Error:
TypeError: must assign iterable to extended slice
"""
4

1 に答える 1

1

の長さがわかっている場合は、無限ジェネレーターを切り離すために使用var_listできます。itertools.islice

>>> import itertools
>>> infgen = itertools.cycle([1,4,9])
>>> a,b,c,d = itertools.islice(infgen, 4)
>>> a,b,c,d
(1, 4, 9, 1)

リストのスライスへの割り当てにも機能します。

>>> lst = [0]*20
>>> lst[2:10:2] = itertools.islice(infgen, 4)
>>> lst
[0, 0, 4, 0, 9, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
于 2010-10-17T18:22:11.930 に答える