4

わかりました、私はこのコードを持っています:

colors = ["Red" , "Green" , "Blue" , "Pink" , "Purple" , "Cyan"]

search = str(raw_input())

found = "not"

if search in colors:
    print "Found!"
else:
    print "not Found"

これまでのところ、リスト内にある文字列を端末に正確に入力した場合にのみ、リスト内の 1 つの項目を見つけることができます。これが問題です。

端末に 1 つまたは 2 つの文字を入力して、検索に一致するリスト内の文字列を一覧表示できるようにする必要があります (たとえば、端末に「P」と入力すると、「Pink」が一覧表示されます)。 " と "Purple" は、これまでの検索と一致するためですが、完全には一致しません)

私は何かを見落としているかもしれませんが、検索するためだけに200行を超えるコード(これを実装する必要があるため、リストに150を超える文字列があるため200行以上)を使用せずに、この方法でリストを検索できる方法はありますか文字列の?

4

7 に答える 7

5

リスト内包表記を使用する最も簡単な方法:

matches = [color for color in colors if color.startswith(search)]

リストが大きい場合、これはうまく機能しない可能性があります。

于 2013-03-18T01:17:01.377 に答える
2

必要なのは適切なデータ構造です。あなたの要件の説明から、 tryがまさにその1つであると思います。

色のリストを使用してトライを作成し、ユーザー入力を使用してトライを検索します (接頭辞を使用できます)。githubでさまざまな実装を見つけるか、自分で実装することができます。:)

于 2013-03-18T01:18:17.097 に答える
2

パフォーマンスが問題にならない場合 (例: カラー リストが小さい):

colors = ["Red" , "Green" , "Blue" , "Pink" , "Purple" , "Cyan"]
search = str(raw_input())
found = "not"

for color in colors:
    # or if color.startswith(search), depend on your needs
    if search in color:
        print "Found"

print "not Found"

それ以外の場合は、Trie を使用してください: http://en.wikipedia.org/wiki/Trie

于 2013-03-18T01:19:00.843 に答える
2

difflib 標準 Python ライブラリを使用できます。

サンプルコード:

from difflib import SequenceMatcher
colors = ["Red", "Green", "Blue", "Pink", "Purple", "Cyan"]
search = str(raw_input())
for color in colors:
    s = SequenceMatcher(None, search, color)

    if s.ratio() > 0.25:
        print color

出力:

xxxx$ python foo.py 
p
Purple

ノート:

必要に応じて一致率を操作できます。ここでは、マイニング パターンに 0.25 以上の比率を使用しました。

于 2013-03-18T01:25:46.947 に答える
2

正規表現を使用すると、テキストのどの部分を照合する必要があるかを判断できます。以下は、文字列の先頭のみを検索します。

import re

colors = ["Red" , "Green" , "Blue" , "Pink" , "Purple" , "Cyan"]
search = re.compile("^"+str(raw_input()))
isthere=[]
for col in colors:
    if search.findall(col)!=[]:
        isthere.append(col)

if isthere==[]:
    print "Nothing there"
else:
    print isthere
于 2013-03-18T01:27:29.783 に答える
1
search = str(raw_input())

matches = [s for s in colors if s.startswith(search)]

次に、一致をループして印刷します。

于 2013-03-18T01:16:56.117 に答える
1
    for c in colors:
        if c[0:len(search)-1] == search:
            print "Found!"

絶対的に最もエレガントなソリューションではありませんが、仕事は完了します。リストをループして、関連する部分文字列を比較するだけです。確かに、検索文字列が色のどの要素よりも長い場合に備えて、これを KeyError の try/catch ブロックでラップすることをお勧めします。

于 2013-03-18T01:17:22.710 に答える