2017-06-25 17 views
0

次のような構造を考えてみましょう -pythonでリストとして行列の上三角部分を表示するための効率的な方法

68 69 70 71 72 * 
73 74 75 76 * 77 
78 79 80 * 81 82 
83 84 * 85 86 87 
88 * 89 90 91 92 
* 93 94 95 96 97 

私は上半分のリストを生成する必要が

[68, 69, 70, 71, 72, 73, 74, 75, 76, 78, 79, 80, 83, 84, 88] 

すなわち構造だけです説明のために、上記の場合のように開始と長さの2つの値が与えられます。start=68length = 5です。ここで

は、リストを生成するために私のコードです -

start = 68 
length = 5 

ls = [] 
for i in range(length): 
    for j in range(length-i): 
     ls.append(start) 
     start = start+1 
    start = start+i 

print(ls) 

同じことを達成するためのより効率的な方法はありますか?

答えて

5

内側のループを見てください。内側のループでは、連続した数字だけが追加されます。 1 extendと交換してください:ダニエルの答え@

length = 5 
start = 68 

ls = [] 
for cnt in range(length): 
    ls.extend(range(start+length*cnt, start+length*(cnt+1)-cnt)) 
+0

私のコードよりもはるかに高速です。私のユースケースではうまく動作しますが、99999のような大きな長さのメモリエラーが発生しています。どのように対処するのかは興味深いでしょう。 –

+0

'length = 99999'の場合、50億の整数を含むリストを生成します。実際には、おそらくこのリストを実際に作成する必要はありません。代わりに、指定された 'start'と' length'の 'x'がセット内にあるかどうかを判断する関数を書くことができます。 – danyamachine

+0

@ShivendraSinghこれはあまりにもこのコードのユースケースです。分散コンピューティングなどを考えてみましょう。 –

0
from itertools import chain 

length = 5 
start = 68 
ls = list(chain.from_iterable(range(start+i*length,start+i*length+length-i) for i in range(length))) 
0

することは非常にきれいで、簡潔です。ここでは、一つだけのnサイズのループでこれを達成することができますなぜあなたは理解するのに役立つかもしれない、より詳細なバージョンは、次のとおりです。

def top_half(start, length): 
    output = [] 
    # current length is the number of ints we want to grab from our current line 
    current_length = length 
    # current start is the int at the beginning of the line we are on 
    current_start = start 
    for i in range(length): 
    output = output + range(current_start, current_start+current_length) 
    current_start = current_start + length 
    current_length = current_length - 1 
    return output 

我々はcurrent_startとCURRENT_LENGTHの変数を格納することなく、これを再作成することができます:

def top_half(start, length): 
    output = [] 
    for i in range(length): 
    output = output + range(start + length * i, start + length * i + length - i) 
    return output 

編集:このコードを使用することはお勧めできません。この回答は説明のためのものです。

関連する問題