1

今日は少し多すぎるかもしれませんが..しかしまあ。

この問題は私にはかなり混乱しています。この関数は、文字列のリストをパラメータとして受け取り、その前にある文字列のサブ文字列であるすべての文字列を返します。それで

  1. ["hope"、 "hop"、 "hopefully"、 "test"、"testing"]は['hop']を返します
  2. ["hopefully"、 "hope"、 "hop"、 "testing"、"test"]は['hope'、'hop'、'test']を返します

ここのコードの混乱をすみません、私はまだ学んでいます。

def findSubStrs(lst):
'list ==> list, return list of all strings that are substrings of their predecessor in lst'
res = []
for a in lst:
    if len(int(a-1)) > len(lst):
        res = res + [a]
return res

len(int(a-1))が前の文字列をチェックするように機能すると思いましたが、「TypeError:unsupported operand type(s)for-:'str'and'int'」というエラーメッセージが表示されました。唯一の結果動作はlen(a)<3またはその他のintであることがわかりましたが、必要なものがすべて返されるわけではありません。

4

2 に答える 2

5

zipペアを比較するために使用できます。

>>> s1 = ["hope", "hop", "hopefully", "test", "testing"]
>>> [b for a,b in zip(s1, s1[1:]) if b in a]
['hop']
>>> s2 = ["hopefully", "hope", "hop", "testing", "test"]
>>> [b for a,b in zip(s2, s2[1:]) if b in a]
['hope', 'hop', 'test']

あなたのコードに関して:

res = []
for a in lst:
    if len(int(a-1)) > len(lst):
        res = res + [a]
return res

これにより、のすべての要素がループしますlstlen(int(a-1))文字列から1を減算し、結果を整数に変換してから整数の長さを取得し、その後、その長さをリストの長さと比較しますlen(lst)。それはあなたが望むものではありません。(別の回答では、ループとインデックスを使用してこれを行う正しい方法がすでに説明されているので、やめます。)

于 2013-02-04T05:06:26.543 に答える
2

どのように試合

print [my_list[i] for i in range(1,len(my_list)) if my_list[i] in my_list[i-1]]

例えば

>>> def findSubStrs(my_list):
...     return [my_list[i] for i in range(1,len(my_list)) if my_list[i] in my_list[i-1]]
>>> findSubStrs(["hope", "hop", "hopefully", "test", "testing"] )
['hop']
>>> findSubStrs(["hopefully", "hope", "hop", "testing", "test"])
['hope', 'hop', 'test']

リスト内包表記なしでこれを行うには、単純なループを使用できます

for i in range(1,len(my_list)):
    if my_list[i] in my_list[i-1]:
        print my_list[i]
于 2013-02-04T05:02:39.803 に答える