2016-08-03 7 views
1

私はintの乱数を含むリストを持っています。 私はこのリストを反復したいと思います。数字と連続する数字が互いに1つの数値ステップ内にある場合は、それらをサブリストに連結したいと思います。例えば隣接する数値をPythonのリストにマージする

input = [1,2,4,6,7,8,10,11] 
output = [[1,2],[4],[6,7,8],[10,11]] 

入力リストは常に昇順にソートされた正のint型が含まれています。 hereからコードの一部を試しました。

initerator = iter(inputList) 
outputList = [c + next(initerator, "") for c in initerator] 

私は、リスト内のすべての2つのエントリをCONCATことができますが、私はリスト内包に適したifを追加するように見えることはできません。

Pythonのバージョン= 3.4

+3

itertools.groupby(enumerate(inputList)、lambda x:x [1] - x [0])] 'の[[[xのgrp]は、iのgrp]です。 –

+0

ありがとう、これは良いと思う......と私は仕事の種類を理解しています...しかし、もし私が入力= [a1、a2、a4、b6 、[c7、c8、c10、d11]の場合は、[[a1、a2]、[a4]、[b6]、[c7、c8]、[c10]、[d11] ...私は "groupby"と "enumerate"メソッドを完全に理解していないので、おそらく私はこれを得ることができないでしょう...もう一度ありがとう – Eoin

答えて

0

ニースの方法は、( "分割" の指標を発見し、その後、スライス:

enumerate()zip()を使用して
input = [1,2,4,6,7,8,10,11] 
idx = [0] + [i+1 for i,(x,y) in enumerate(zip(input,input[1:])) if x+1!=y] + [len(input)] 
[ input[u:v] for u,v in zip(idx, idx[1:]) ] 
#output: 
[[1, 2], [4], [6, 7, 8], [10, 11]] 

0

を使用すると、ワンライナーを持っている必要がない限り。単純なジェネレータ関数を使用して、連続していない要素にヒットするまで要素を組み合わせることができます。

def consec(lst): 
    it = iter(lst) 
    prev = next(it) 
    tmp = [prev] 
    for ele in it: 
     if prev + 1 != ele: 
      yield tmp 
      tmp = [ele] 
     else: 
      tmp.append(ele) 
     prev = ele 
    yield tmp 

出力:任意の輸入のない私が持っている

In [2]: lst = [1, 2, 4, 6, 7, 8, 10, 11] 

In [3]: list(consec(lst)) 
Out[3]: [[1, 2], [4], [6, 7, 8], [10, 11]] 
0

最も簡単なバージョン:1つのライナーより

def mergeAdjNum(l): 
    r = [[l[0]]] 
    for e in l[1:]: 
     if r[-1][-1] == e - 1: 
      r[-1].append(e) 
     else: 
      r.append([e]) 
    return r 

約33%高速化。

この1つはコメントで述べたグループ化文字の接頭辞を処理します。

def groupPrefStr(l): 
    pattern = re.compile(r'([a-z]+)([0-9]+)') 
    r = [[l[0]]] 
    pp, vv = re.match(pattern, l[0]).groups() 
    vv = int(vv) 
    for e in l[1:]: 
     p,v = re.match(pattern, e).groups() 
     v = int(v) 
     if p == pp and v == vv + 1: 
      r[-1].append(e) 
     else: 
      pp, vv = p, v 
      r.append([e]) 
    return r 

は、これが唯一の数よりも方法も遅いです。接頭辞の正確な形式(1つの文字のみ)を知っていると、reモジュールの使用を避けて処理速度を上げることができます。

関連する問題