2017-04-09 1 views
2

これは私にしばらくの間、いくつかの問題を与えてきた、多分私はトンネルビジョンを持っている。整数のリストがあれば、隣接する重複のすべてのグループがタプルに変換された新しいリストを生成します。例えばリストの理解を使用して、タプルとitertools.groupby

、リストを与えられた:[1, 2, 3, 3, 4, 5, 5, 5, 6]

生成されたリストには含まれています:[1, 2, (3, 3), 4, (5, 5, 5), 6]

私は、この使用してリストの内包を実現したいと思います。

numbers = [1, 2, 3, 3, 4, 5, 5, 5, 6] 

it = itertools.groupby(numbers) 
numbers = [tuple(group) if len(tuple(group)) > 1 else key for key, group in it] 

結果、私は期待してい:

[1, 2, (3, 3), 4, (5, 5, 5), 6]

結果、私は取得しています:

[1, 2,(), 4,(), 6]

挿入タプルは明らかに、空になっている - でなく、彼らが最初に挿入されるためにそれらの中に複数の要素を持っていなければならなかったので、彼らは同じではありません。どうしたの?私はPythonには新しく、すべてのキーワードを使い果たした後も、私はまだオンラインで同様の質問を見つけることができませんでした。私はそれが単純なものだと確信しており、私はそれを見ることができません。どんな助けもありがとうございます。

答えて

0

をしたい場合は、問題は、グループ変数は一度だけ反復することができますイテレータであるということです。疲れた後は空に見えます。中間グループを一時的に保存する必要があります。行くための一つの方法は、itzmeontvが示唆したように、ネストされた発電機/ comprehesionsを使用している、またはマッピング機能を使用する:

def make_group(group): 
    group = tuple(group) 
    if len(group) == 1: 
    return group[0] 
    return group 

numbers = [make_group(group) for key, group in itertools.group_by(numbers)] 
+0

Tamasさんありがとう!私はあなたの答えをあなたが説明をしたので私の問題を解決したものとして受け入れました。 –

3

あなたはlist comprehension

>>>l = [1, 2, 3, 3, 4, 5, 5, 5, 6] 
>>>[k[0] if len(k) == 1 else tuple(k) for k in [list(j) for i,j in itertools.groupby(l)]] 
[1, 2, (3, 3), 4, (5, 5, 5), 6] 
+0

はありがとうを@itzmeontv! –

1

あなたはこの1つの

a = [1, 2, 3, 3, 4, 5, 5, 5, 6] 
[(i,)*a.count(i) if a.count(i)>1 else i for i in set(a)] 

出力してみてください可能性があります

[1, 2, (3, 3), 4, (5, 5, 5), 6] 
+0

私はOPがそれらを順番に望んでいるのかどうか分かりませんが、あなたの答えは、(最適ではない時間の複雑さに加えて)ほとんどの場合(小さい数字の場合のみ)順番に数字を返しません。 –

関連する問題