2016-10-23 9 views
3

辞書を使わずにリスト内の値をタプルに接続しようとしています。Python:whileやforループを使ってリストを反復する

adjList = [('0', '3'), ('1', '0'), ('3', '2'), ('4', '2'), ('5', '4'), ('7', '9'), 
('8', '7'), ('9', '6'), ('2', '1'), ('2', '6'), ('6', '5'), ('6', '8')] 

及びIは、ランダムタプルの値でリストを作成したい:

newList = ['1', '0'] 

最初場合adjListからタプルの第2の値を追加し、具体的に、私はこのリストを持っていますそのタプルの値、したがって、newListの最後の値と同じである。

newList = ['1', '0', '3'] 

[削除( '1'、 '0')と( '0'、 '3')adjListから。

THEN newList NO LONGERの最後の値がadjListのタプルの最初の値に一致するまで、このアクションを繰り返します。私は、これを行うことができるwhileループとforループの論理的な組み合わせを考え出すのに多くの問題を抱えています。これまで

マイコード:

adjList = [('0', '3'), ('1', '0'), ('3', '2'), ('4', '2'), ('5', '4'), ('7', '9'), 
('8', '7'), ('9', '6'), ('2', '1'), ('2', '6'), ('6', '5'), ('6', '8')] 

firstNode = random.choice(adjList) 
newList = [] 
newList.append(firstNode[0]) 
newList.append(firstNode[1]) 
adjList.remove(firstNode) 

## I need to repeat the following block of code: 

for ax,bx in adjList: 
    if newList[-1] == ax: 
     adjList.remove((ax,bx)) 
     newList.append(bx) 
     break 

すべてはそれが必要な方法を動作しますが、もちろん、私は唯一の終わりにnewListに3つの値を取得しています。 adjListのタプルがなくなるまで、コードの最後のブロックをどのように繰り返すのかどうかはわかりません。

ご協力いただきありがとうございます。

+1

?無作為に選択されたタプルが '( '9'、 '6')' 'newList'の正しい値とは何でしょうか? – niemmi

+0

newListの正しい値は['9'、 '6'、 '5']となります。一致する値を持つ最初のタプルを取得するだけで問題ありません。 – Andrade

+0

ランダムなノードを選択しないと、デバッグが簡単になるでしょう。 –

答えて

0

次のコードがあなたのニーズに当てはまるかどうかはよく分かりませんが、コードの変更はほとんど必要ないと思います。

#!/usr/bin/env python 
import random 

adjList = [('0', '3'), ('1', '0'), ('3', '2'), ('4', '2'), ('5', '4'), ('7', '9'), 
      ('8', '7'), ('9', '6'), ('2', '1'), ('2', '6'), ('6', '5'), ('6', '8')] 

firstNode = random.choice(adjList) 
newList = [] 
newList.append(firstNode[0]) 
newList.append(firstNode[1]) 

changes_made = True 
while changes_made: 
    changes_made = False 
    for item in adjList: 
     if item[0] == newList[-1]: 
      newList.append(item[-1]) 
      adjList.remove(item) 
      changes_made = True 
      break 

print newList 
1

あなただけの可能性:

私は(基本的には、最初の項目タプルがnewListで最後の項目と一致していることを毎回)構造に変化がありますたびに実行whileループを追加しましたadjListにまだ項目がある間に、外側のwhileループを実行します。内部ループはadjListから最初の適切な項目を選択し、結果をnewListに追加することができます。内部ループが適切な項目を見つけることができない場合は、外部ループを終了する必要があります。

は、ここでは上記のサンプルです:

import random 

adjList = [('0', '3'), ('1', '0'), ('3', '2'), ('4', '2'), ('5', '4'), ('7', '9'), 
('8', '7'), ('9', '6'), ('2', '1'), ('2', '6'), ('6', '5'), ('6', '8')] 

newList = list(adjList.pop(random.randint(0, len(adjList) - 1))) 

while adjList: 
    for i, (src, dest) in enumerate(adjList): 
     if src == newList[-1]: 
      del adjList[i] 
      newList.append(dest) 
      break 
    else: 
     break 

print('Result: {}'.format(newList)) 
print('Remaining: {}'.format(adjList)) 

出力:何 `adjList`から選択する多くの可能なタプルがある場合について

Result: ['4', '2', '1', '0', '3', '2', '6', '5', '4'] 
Remaining: [('7', '9'), ('8', '7'), ('9', '6'), ('6', '8')] 
+0

これも私の問題の素晴らしい解決策です!おかげさまで、私は助けに感謝します。 – Andrade

関連する問題