2016-08-12 8 views
0

私はこのリストを持っている区切り文字列の各項目にアクセスして一致する項目を一覧表示する方法は?</p> <pre><code>box = ["apple","orange","banana", "water"] </code></pre> <p>そして、この文字列:

CheckList = "1, orange | 2, apple | 3, banana | 4, milk" 

注:文字列が"|"","区切り文字を持っています。 |区切り文字は、各項目を区切ると,区切り文字は、項目とそのキーの間で区切る(すなわちkeyitem|keyitem、など)

問題: 私はboxリストの各項目を反復処理したいと文字列CheckListにcorespoinding keyが見つかりました。

出力は次のようにする必要があります:

foundItems = ["2","1","3", "water"] 

私は、一般的にこの問題を解決するためにどのように任意のアイデアを処理し、プログラミングをテキストにbegginerのですか?

私はこれを試しましたが、それは助けにはなりません。

for i in CheckList.split("|"): 
    for j in box: 
     if i.split(",")[0] == j 
+1

キーを見つけられない場合は、見つかった対応するアイテムをそれ自身にしますか? –

+0

はい、 'box'リストにあるアイテムだけが' foundItems'に対応するキーを持っています。そうでなければ、 'CheckList'に対応するキーを持たない' box'アイテムを保持してください。 – MEhsan

+0

ちょうど楽しみのため:正規表現ベースのアプローチ:https://ideone.com/ZIK6a2 –

答えて

1

CheckList内にスペースが(確かに、彼らはあなたが与えた例ではありませんよう)一貫するつもりされていない場合、私はすべてのスペースを除去するために最初のランニングCheckList = CheckList.replace(" ","")をお勧めします。それ以外の場合は、" | "または", "を使用してsplitにしてください。

それ以外は、コードは正常に動作するはずです。あなたがfoundItems = box.copy()を使用して初期化する場合は、あなたのループはj in range(len(box))を使用する代わりにj in box

for i in CheckList.split("|"): # or " | " 
    for j in range(len(box)): 
     if i.split(",")[1] == box[j]: 
      foundItems[j] = i.split(",")[0] 

のように見えることができ、foundItemsの対応する要素にアクセスしやすいことを意味します。

1

まず、間違ったインデックスをi.split(",")にチェックしているようです。 Pythonは0でインデックス付けされているので、i.split(",")[0]を参照するときは、右側(果物)をチェックするように見えるときにコンマ(この場合はキー)の左側をチェックしています。

次に、 このような文字列を解析するときに空白を取り除いていることを確認してください。たとえば、CheckListの最初の項目は「1、オレンジ」です。これを分割すると、["1"," orange "]の配列が得られます。文字列orangeの前後の空白に注意してください。 "orange"" orange "を比較しようとすると、それらが等しくないことがわかります。先頭と末尾の空白を削除するには、i.split(",")[1].strip()に電話をかけることができます。

最後に、この機能はあまり効率的ではありません。 forループが別のforループの内部にある場合、CheckListの各要素をboxの各要素に対してチェックしています。これはO(n^2)の複雑さです。これは4つのアイテムのためのそれほど大きな取引ではありませんが、これらのリストが大きければ、時間はすばやく増加します。ここで私は、この関数を記述する方法を次のとおりです。

box = ["apple","orange","banana", "water"] 
CheckList = "1, orange | 2, apple | 3,banana | 4,milk" 
CheckDict = {} 
for i in CheckList.split("|"): 
    j = i.split(",") 
    CheckDict[j[1].strip()] = j[0].strip() 
foundItems = [] 
for i in box: 
    if i in CheckDict: 
     foundItems.append(CheckDict[i]) 
    else: 
     foundItems.append(i) 
2

まず、CheckListからマッピングを取得し、その後、boxからアップそれを見て:

box = ["apple","orange","banana", "water"] 
CheckList = "1, orange | 2, apple | 3,banana | 4,milk" 

d = dict(reversed(items.split(',')) for items in CheckList.replace(' ', '').split('|')) 
foundItems = [d[x] if x in d else x for x in box] 
print foundItems 

空白文字列のに注意してください。

+0

あなたは素晴らしいです!私は 'CheckList'を編集して一貫性を持たせました。 – MEhsan

0

ここでは良い答えが、私はこの2つのライナーを提供すると思った。

>>> d = {i.split(',')[1].strip():i.split(',')[0] for i in checkList.split('|')} 
>>> print [d[key].strip() if key in d else key for key in box] 
['2', '1', '3', 'water'] 
関連する問題