2012-04-15 15 views
0

3つ以上の文字が「均等に」配置されている単語、つまり左から右の連続した文字のord()値が偶数(同じ差分値)の単語を返す関数については、助けが必要です。これは私がこれまで持っているものです...と出力は次のとおりです。タプル(単語、値)のリストから単一のタプル(単語、値)のリストを返す方法は?

test_list2 = ['i', 'made', 'an', 'ace', 'today', 'at', 'tennis...yeaah', 'booi', ':d'] 

for word in test_list2: 
    if len(word) >=3: 
    temp_list = [] 
    for chr1 in word: 
    if word.index(chr1) != (len(word)-1): 
     chr2 = word.index(chr1)+1 
     num = ord(word[chr2]) - ord(chr1) 
     temp_list.append(num) 
    temp_tup = (word, temp_list) 
    final_list.append(temp_tup) 

final_list = [('made', [-12, 3, 1]), ('ace', [2, 2]), ('today', [-5, -11, -3, 24]), 
    ('tennis...yeaah', [-15, 9, 0, 0, 10, -69, 0, 0, 0, -20, 9, 0, 0]), 
    ('booi', [13, 0, 0])] 

しかし、私は均等に(「エース」)間隔を置いて配置されているものだけを返す必要があります。出力は、あなたが、あなたはそれが単語全体で同じままかどうかを確認するためにnumを追跡することができ、非等間隔の数字でfinal_listを必要としないと仮定すると、このよう

[('ace',2)] 

答えて

0

でなければなりません。異なるnumが見つかった場合は、次の単語に進みます。 numが同じままなら、final_list(word, num)タプルを追加します。

for word in test_list2: 
    if len(word) >=3: 
    all_nums_are_same = True 
    prev_num = None 
    for chr1 in word: 
     if word.index(chr1) != (len(word)-1): 
     chr2 = word.index(chr1)+1 
     num = ord(word[chr2]) - ord(chr1) 
     if not prev_num: 
      prev_num = num 
     elif prev_num != num: 
      # different number is found, we can 
      # stop and move on to next word 
      all_nums_are_same = False 
      break 

    if all_nums_are_same: 
     # only add tuple if all numbers we the same 
     temp_tup = (word, prev_num) 
     final_list.append(temp_tup) 

これは、結果として得[('ace',2)]

0

私がコンパイルされ、私のマシン上で動作します:)

あなたには、いくつかのより複雑なデータ(例でそれをテストしたい場合は、余分なデバッグジャンクの束は、print文のようにそこにあります、Pythonの3.3でこれを打ちました:テキストの長いブロック)にバグがあります。

あなたのword.indexではなく、enumerate()を使っていますが、どちらがもっとpythonicですか?

import sys 

### Define variables 
test_list = ['i', 'made', 'an', 'ace', 'today', 'at', 'tennis...yeaah', 'booi', ':d'] 
proc_check = [('made', [-12, 3, 1]), 
        ('ace', [2, 2]), 
        ('today', [-5, -11, -3, 24]), 
        ('tennis...yeaah', [-15, 9, 0, 0, 10, -69, 0, 0, 0, -20, 9, 0, 0]), 
        ('booi', [13, 0, 0])] 
final_check = [('ace', [2,2])] 

test_list2 = ['ace', 'ace', 'ace'] 
proc_check2 = [('ace', [2, 2]), 
       ('poo', [3, 3]), 
       ('ace', [2, 2])] 
final_check2 = [('ace', [2,2]),('poo', [2,2]),('ace', [2,2])] 

### Function definitions 
def wordIsEven(word_list, proc_list_check):  
    final_list = [] 
    procd_list = [] 

    for word in word_list: 
     temp_list = [] 

     if len(word) >= 3:   
      for chr1 in word: 
       if word.index(chr1) != (len(word)-1): 
        chr2 = word.index(chr1)+1 
        num = ord(word[chr2]) - ord(chr1) 
        temp_list.append(num) 

      temp_tup = (word, temp_list) 
      procd_list.append(temp_tup) 

    errors = False 
    for i, check in enumerate(procd_list): 
     if check != proc_list_check[i]: 
      errors = True 
      print("Word Eval Fail! " + str(check) + " != " + str(proc_list_check[i])) 

    if errors == True: 
     print("List compare failed!") 
    else: 
     print("Lists compare equally!") 

    for tmp_tup in procd_list: 
     print("Examining Slice: "+str(tmp_tup[1])) 
     for i, num in enumerate(tmp_tup[1]): 
      if i + 1 < len(tmp_tup[1]): 
       num2 = tmp_tup[1][i+1] 

       if num == num2: 
        if num != 0: 
         print("Got one! " + str(tmp_tup)) 
         final_list.append(tmp_tup)    
    return final_list 

### Code execution 

my_list = wordIsEven(test_list2, proc_check2) 
my_check = final_check2 

print("Printing Final list:") 
for i, item in enumerate(my_list): 
    tempStr = str(item) 
    if item != my_check[i]: 
     tempStr += " doesn't match check data..." + str(my_check[i]) 
    print(tempStr) 
sys.exit() 
関連する問題