2016-10-23 52 views
3

我想連接列表中的元組中的值而不使用字典。具體而言,我有這樣的名單:Python:使用while或循環遍歷列表

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 = ['1', '0'] 

然後從adjList如果第一個追加一個元組的第二個值該元組的值是相同的newList的最後一個值,即:

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

然後刪除( '1', '0')和( '0', '3')從adjList。

那麼我想重複這個動作,直到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

什麼,那裏有許多可能的元組'adjList'選擇的情況下?假設隨機選擇的元組是'('9','6')'newList'的正確值是什麼? – niemmi

+0

newList的正確值將是['9','6','5']。把第一個元組與匹配值相聯繫就可以了。 – Andrade

+0

我想如果你不選擇一個隨機節點,調試會更容易。 –

回答

0

我不是很確定下面的代碼是否適用於您的需求,但我認爲您應該能夠對代碼進行很少的更改。

我添加了一個while循環,運行,每有一個在結構的變化(基本上,每一個元組,其第一項newList的最後一個項目比賽時間)時間:

#!/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

你可以只運行外部while循環,同時仍有adjList上的項目。內循環可以從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)) 

輸出:

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

這也是我的問題的一個很好的解決方案!非常感謝,我感謝幫助。 – Andrade