Python:使用while或for循环迭代列表

时间:2016-10-23 02:04:15

标签: python list while-loop

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

<NSCopying, NSMutableCopying,NSSecureCoding

我想创建一个包含随机元组值的列表:

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的最后一个值相同,则从adjList追加元组的第二个值,因此:

newList = ['1', '0']

然后从adjList中删除(&#39; 1&#39;,&#39; 0&#39;)和(&#39; 0&#39;,&#39; 3&#39;)。

然后我想重复此操作,直到newList NO LONGER中的最后一个值对应于来自adjList的元组的第一个值。我很难找到可以做到这一点的while或for循环的逻辑组合,并且任何帮助都会受到赞赏。

到目前为止我的代码:

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

一切都按照它应该的方式工作,但当然我最后只在newList中得到3个值。我无法解决如何重复最后一段代码,直到我在adjList中用完元组。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分: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')]

答案 1 :(得分: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