Python:使用while或for循环遍历列表

3
我将尝试在不使用字典的情况下连接列表中元组内的值。具体来说,我有这个列表:
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']

如果元组的第一个值与newList的最后一个值相同,则将adjList中元组的第二个值添加到newList中,即:
newList = ['1', '0', '3']

然后从adjList中删除 ('1', '0') 和 ('0', '3')。

然后我想重复此操作,直到newList中的最后一个值不再对应于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
新列表(newList)的正确值将是['9','6','5']。只需使用具有匹配值的第一个元组即可。 - Andrade
如果你不选择随机节点,调试起来可能会更容易。 - Lord_PedantenStein
随机节点与我需要重复的代码块没有任何关系。如果这更容易想象,那么可以把它看作是两个起始列表:已发布的adjList和newList = ['1','0'],然后我需要从这里开始匹配值并将它们添加到newList中。 - Andrade
2个回答

1
你可以在 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))

输出:

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

这也是我的问题的一个很好的解决方案!非常感谢,我很感激你的帮助。 - Andrade

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接