2

1一連の数値をループして、数値の範囲 (例: <100) を探しています。

例: リスト = [1, 2, 3, 125, 7, 8, 9, 200]。ファイルに入れたい: 1-3、7-9。私が直面した問題は、外側のループが内側のループ内のアイテムを反復処理するため、得られる出力は 1-3、2-3、3、7-9、8-9、9 であるということです。

機能する私の現在の戦略:

counter = 1

for i in range(len(list)):  # outer loop
    if counter > 1: # prevents the outer loop from iterating the numbers iterated in inner loop
        counter -= 1
        continue
    elif counter <=1:
        while list[i] < 100:
            i +=1
            counter +=1
            if list[i] > 100:
                print list[i-counter], '-', list[i]
                break

追加のカウンターを使用する代わりに、内側のループで反復されたアイテムをスキップするように外側のループを取得するためのよりPythonicな方法があるかどうか疑問に思っています(上記のように)。ありがとう。

編集: 連続した数字に焦点を当てた返信はほとんどありません. 私の間違い、番号は連続している必要はありません。その範囲の最初と最後の数字だけが必要です。たとえば、list = [1,4,8, 12, 57, 200, 4,34, 300] です。出力: 1 ~ 57、4 ~ 34。リストと条件はユーザーによって異なります。基準は常に比較演算子「<」を含む数値になります。ありがとう。

4

3 に答える 3

4

2 つのループは必要ありません。1 つで十分です。

def ranges(seq):
  it = iter(seq)
  start = end = next(it)
  for val in it:
    if val == end + 1:
      end = val
    else:
      if end - start > 1:
        yield start, end
      start = end = next(it)

for start, end in ranges([1, 2, 3, 125, 7, 8, 9, 200]):
  print('%d-%d' % (start, end))

ロジックはあなたのものとは少し異なります。連続した数字で構成されるサブシーケンスを探します(例では1 2 3and 7 8 9)。必要に応じて、ロジックを簡単に変更して、任意の番号でシーケンスを中断することもできます>= 100

于 2013-01-31T16:58:33.143 に答える
2

while ループに基づく別のアプローチ:

def print_ranges(given_list, limit):
    while given_list:
        start = end = given_list.pop(0)
        if start < limit:
            while given_list and (given_list[0] < limit):
                end = given_list.pop(0)
            if (end != start):
                print "%d-%d"%(start,end)  # or save it in another list

いくつかのテスト:

>>> print_ranges([1,4,8, 200, 4,34, 72, 300], 100)
1-8
34-72

>>> print_ranges([1, 4, 8, 12, 57, 200, 4, 34, 300], 100)
1-57
4-34

>>> print_ranges([1, 4, 8, 12, 57, 200, 4, 34, 300], 250)
1-34
于 2013-01-31T17:18:48.460 に答える
0

使用zip():

zip(lis,lis[1:])次のようなものを返します。

 [(0, 1),
 (1, 2),
 (2, 3),
 (3, 5),
 (5, 6),...]

これで、このリストを繰り返し処理して、差が 1 かどうかを確認できます。

コード:

In [103]: def ranges(lis):
    ans=[]
    z=zip(lis,lis[1:])
    for x,y in z:
        if y-x==1:
            ans.extend([x,y])
        else:    
            if ans:
                yield "{0}-{1}".format(min(ans),max(ans))
                ans=[]
    if ans:        
          yield "{0}-{1}".format(min(ans),max(ans))
   .....:         

In [104]: lis=[0,1,2,3,5,6,7,8,10,11,2,3,4]

In [105]: list(ranges(lis))
Out[105]: ['0-3', '5-8', '10-11', '2-4']
于 2013-01-31T17:24:32.000 に答える