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

Posted

技术标签:

【中文标题】Python:使用 while 或 for 循环遍历列表【英文标题】:Python: using while or for loop to iterate through an lists 【发布时间】:2017-03-05 01:48:17 【问题描述】:

我正在尝试在不使用字典的情况下连接列表中元组中的值。具体来说,我有这个列表:

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 = ['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 中的元组之前,我无法完全弄清楚如何重复最后的代码块。

提前感谢您的帮助。

【问题讨论】:

adjList 中有很多可能的元组可供选择的情况如何?假设随机选择的元组是('9', '6')newList 的正确值是多少? newList 的正确值为 ['9', '6', '5']。只取第一个具有匹配值的元组就可以了。 我想如果你不选择随机节点会更容易调试。 随机节点与我需要重复的代码块无关。如果这更简单,可以将其视为两个起始列表:adjList 已发布,newList = ['1', '0'],然后我需要从那里开始,匹配值并将它们添加到 newList。 【参考方案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')]

【讨论】:

这也是解决我问题的好方法!非常感谢,感谢您的帮助。【参考方案2】:

我不太确定以下代码是否能满足您的需求,但我认为您只需对代码进行很少的更改即可完成您想做的事情。

我添加了一个 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

【讨论】:

以上是关于Python:使用 while 或 for 循环遍历列表的主要内容,如果未能解决你的问题,请参考以下文章

C语言如何循环输出1到0这10位数字8遍,即1234567890…?

Python之 for循环while循环

Python 循环 while,for语句

python循环语句

面试问你SQL中的循环for循环游标以及while和do-while循环!!!你是怎么解决的?亲

Python全栈自动化系列之Python编程基础(while循环)