2017-11-01 7 views
1

特に、一定の値に達したときに反復を停止するという点で問題があります。この値に達すると、特定のタスク(後述)を実行して、リストの次の要素に移動します。Pythonで特定のインデックスまでのリストに値を追加する

これは私が達成したいことです。私は何をしたいのですが、各low_lstと各high_lstを追跡することである

[(1, 'x', 'NA'), 
(2, 'x', 'low'), 
(3, 'x', 'NA'), 
(4, 'x', 'NA'), 
(5, 'x', 'NA'), 
(6, 'x', 'high'), 
(7, 'x', 'NA'), 
(8, 'x', 'NA'), 
(9, 'x', 'NA'), 
(10, 'x', 'NA'), 
(11, 'x', 'low'), 
(12, 'x', 'NA'), 
(13, 'x', 'NA'), 
(14, 'x', 'NA'), 
(15, 'x', 'high'), 
(16, 'x', 'NA'), 
(17, 'x', 'NA'), 
(18, 'x', 'NA'), 
(19, 'x', 'NA'), 
(20, 'x', 'NA'), 
(21, 'x', 'low'), 
(22, 'x', 'NA'), 
(23, 'x', 'NA'), 
(24, 'x', 'NA'), 
(25, 'x', 'high'), 
(26, 'x', 'NA')]  

:私はこのようになりますリストlstを持っています。例えば

タプルの第2のインデックス がlowとしてマークされ、その要素以下highとしてマークされていない他のすべての要素は、同様にリストに追加される場合、要素はlow_lstに追加されるであろう。最初のケースでは、[2,3,4,5]となります。 [6,7,8,9,10]:それはそうhigh.としてマークされているため

6は、6high_lstに追加されます以下を含むすべての要素を含まれません。

最終的な出力は次のようになります。ここに私はこれまで何をやったかだ

low_lst = [[2,3,4,5],[11,12,13,14], [21,22,23,24]] 
high_lst = [[6,7,8,9,10],[15,16,17,18,19,20], [25,26]] 

vals_list_low = [] 
vals_list_high = [] 

i = -1 
for x, y, z in lst: 
    if z == "low": 
     vals_list_min.append(lst[:i]) 
    if z == "high": 
     vals_list_max.append(lst[:i]) 
     i += 1 

私は特定のインデックスにすべての要素を追加しようとしますが、わからないよいますどうやって。

+0

を試してみてください、 2,3,4?次の2つは11で始まり、次に21で始まります。 ハイリストと同様の問題がありますが、最初は5から10になると思います。 モジュラスを1つまたは2つ使用するとアルゴリズムを作成できますが、1がスキップされたために最初のエントリが奇妙に見えます。 1はスキップされるはずですか? –

+0

@FruckubusCruntは技術的にはそうですが、私は 'low'の開始値を 'low'としてマークされている行にすることを検討していますので、スキップすることになっています。 – djennacs

+0

ああ、申し訳ありません、何が起こっているのか分かりました。私の間違い。 –

答えて

1

変数を使用すると、リスト生成の状態を追跡できます。 'low'要素にヒットすると、low_lstに切り替わります。 'high'の場合はその逆です。辞書は状態をリストにマップし、サブリストは値を保持します。

low_lst = [] 
high_lst = [] 

STATE = None 
state_dict = {'low': low_lst, 'high': high_lst} 

for x, y, z in lst: 
    if z=='low' or z=='high': 
     STATE = z 
     sublist = [] 
     state_dict[STATE].append(sublist) 
     sublist.append(x) 
    if STATE and z=='NA': 
     sublist.append(x) 

low_lst 
high_list 
# returns: 
[[2, 3, 4, 5], [11, 12, 13, 14], [21, 22, 23, 24]] 
[[6, 7, 8, 9, 10], [15, 16, 17, 18, 19, 20], [25, 26]] 
+0

ありがとう、本当に短くて簡潔です! – djennacs

1
a = [(1, 'x', 'NA'), 
(2, 'x', 'low'), 
(3, 'x', 'NA'), 
(4, 'x', 'NA'), 
(5, 'x', 'NA'), 
(6, 'x', 'high'), 
(7, 'x', 'NA'), 
(8, 'x', 'NA'), 
(9, 'x', 'NA'), 
(10, 'x', 'NA'), 
(11, 'x', 'low'), 
(12, 'x', 'NA'), 
(13, 'x', 'NA'), 
(14, 'x', 'NA'), 
(15, 'x', 'high'), 
(16, 'x', 'NA'), 
(17, 'x', 'NA'), 
(18, 'x', 'NA'), 
(19, 'x', 'NA'), 
(20, 'x', 'NA'), 
(21, 'x', 'low'), 
(22, 'x', 'NA'), 
(23, 'x', 'NA'), 
(24, 'x', 'NA'), 
(25, 'x', 'high'), 
(26, 'x', 'NA')] 
low_list = [] 
high_list = [] 
last=0 
mark=None 
for num,tup in enumerate(a): 
    if num == len(a)-1: 
     if mark == "high": 
      high_list.append([i[0] for i in a[last:]]) 
     elif mark == "low": 
      low_list.append([i[0] for i in a[last:]]) 
    elif a[num][2] == "high": 
     if mark == "low": 
      low_list.append([i[0] for i in a[last:num]]) 
     last = num 
     mark = "high" 
    elif a[num][2] == "low": 
     if mark == "high": 
      high_list.append([i[0] for i in a[last:num]]) 
     last = num 
     mark = "low" 
low_list 
high_list 
+0

これは本当にそれを綴ります。 – djennacs

1

使用current_statesub_list内側リストを格納次に、我々は(lowhigh、又はNA)に記載されていた状態を記憶します。

状態が変更されると、内側のリストが完成し、最初から最初に外側のリストにsub_listを追加します。

vals_list_low = [] 
vals_list_high = [] 

sub_list = None 
current_state = 'NA' 


for x, y, z in lst: 
    if z == 'low' or z == 'high': 
     state_changed = current_state != z 
     current_state = z 
     if state_changed: 
      sub_list = [] 
      sub_list.append(x) 
      current_list = vals_list_low if z == 'low' else vals_list_high 
      current_list.append(sub_list) 
      continue 
    if sub_list: 
     sub_list.append(x) 


print vals_list_low 
print vals_list_high 

2連続lowまたはhighが発生した場合、上記の答えは動作します:

a = [(1, 'x', 'NA'), 
(2, 'x', 'low'), 
(3, 'x', 'NA'), 
(4, 'x', 'low'), 
(5, 'x', 'NA'), 
(6, 'x', 'high'), 
(7, 'x', 'NA'), 
(8, 'x', 'NA'), 
] 

ができます:

[[2, 3, 4, 5]] 
[[6, 7, 8]] 
1

が第一の低は1じゃんこの

lst=[(1, 'x', 'NA'), 
(2, 'x', 'low'), 
(3, 'x', 'NA'), 
(4, 'x', 'NA'), 
(5, 'x', 'NA'), 
(6, 'x', 'high'), 
(7, 'x', 'NA'), 
(8, 'x', 'NA'), 
(9, 'x', 'NA'), 
(10, 'x', 'NA'), 
(11, 'x', 'low'), 
(12, 'x', 'NA'), 
(13, 'x', 'NA'), 
(14, 'x', 'NA'), 
(15, 'x', 'high'), 
(16, 'x', 'NA'), 
(17, 'x', 'NA'), 
(18, 'x', 'NA'), 
(19, 'x', 'NA'), 
(20, 'x', 'NA'), 
(21, 'x', 'low'), 
(22, 'x', 'NA'), 
(23, 'x', 'NA'), 
(24, 'x', 'NA'), 
(25, 'x', 'high'), 
(26, 'x', 'NA')] 


def formatlist(inputlist): 
    startlist=[] 
    returnlist=[] 
    for i in inputlist: 
     if i == 'border': 
      if(startlist): 
       returnlist.append(startlist) 
      startlist=[] 
     else: 
      startlist.append(i) 
    return returnlist 



temp="" 
high_lst=[] 
low_lst=[] 
for i in lst: 
    if (i[2]== 'high'): 
     temp="" 
     high_lst.append('border') 
    elif (i[2] == 'low'): 
     temp="" 
     low_lst.append('border') 
    if (i[2]=='high') | (temp == 'high'): 
     high_lst.append(i[0]) 
     temp='high' 
    elif (i[2]=='low') | (temp == 'low'): 
     low_lst.append(i[0]) 
     temp='low' 

low_lst.append('border') 
high_lst.append('border') 


print formatlist(low_lst) 
print formatlist(high_lst) 
+0

私はボーダーの追加使用が好きです – djennacs

関連する問題