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])]

しかし、等間隔 ('ace') のものだけを返す必要があります。出力は次のようになります。

[('ace',2)] 
4

2 に答える 2

0

私はこれをPython3.3で打ち負かし、自分のマシンでコンパイルして動作します:)

バグについてより複雑なデータ(例:長いテキストブロック)でテストしたい場合は、printステートメントのような余分なデバッグジャンクがたくさんあります。

私はあなたの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()
于 2012-04-15T06:57:07.473 に答える
0

final_list等間隔でない数字の が必要ないと仮定すると、 を追跡numして単語全体で同じかどうかを確認できます。別の停留所を見つけたらnum、次の単語に進みます。同じままである場合は、タプルをにnum追加します:(word, num)final_list

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)]結果として得られます。

于 2012-04-15T05:02:15.380 に答える