如何对这样的数组列表进行排序:
((green, yellow]),
(red, orange),
(blue, green),
(yellow, red),
(black, blue))
这样两个元素首尾相连,如下所示:
((black, blue),
(blue, green),
(green, yellow),
(yellow, red),
(red, orange))
答案 0 :(得分:2)
最容易理解的方法可能是将对的元组转换为dict,然后从dict中读取结果:
>>> arr = (('green', 'yellow'),
... ('red', 'orange'),
... ('blue', 'green'),
... ('yellow', 'red'),
... ('black', 'blue'))
>>> dct = dict(arr)
>>> result = []
>>> key = min(dct)
>>> while key in dct:
... result.append((key, dct[key]))
... key = dct[key]
>>> print(result)
[('black', 'blue'), ('blue', 'green'), ('green', 'yellow'), ('yellow', 'red'), ('red', 'orange')]
一旦在一对中找到第二个值并且不是另一对中的相应第一个值,这将结束,我认为这是您正在寻找的规则。但是如果输入数据中存在循环,它将永远循环。要解决这个问题,你可以保留一组到目前为止使用的密钥,如果你发现重复,就会中断:
>>> seen = set()
>>> while key in dct:
... if key in set: break
... result.append((key, dct[key]))
... seen.add(key)
... key = dct[key]
min(dct)
以排序顺序选择第一个元素。如果你想选择不同的东西,你显然需要不同的东西。以下是一些例子:
successors = {succ for prev, succ in arr}
# Any arbitrary key that starts a chain
key = next(key for key in dct if key not in successors)
# Specifically a random key from among those that start a chain:
key = random.choice(dct.keys() - successors)
答案 1 :(得分:0)
为了实现这一点,您需要假设只有两种独特的颜色,即不重复的颜色,因此它们无法连接。似乎所有元组都是唯一的,所以如果颜色出现两次,它会先出现一次,然后出现一次。因此,让我们假设您知道哪个元组包含您想要开始的唯一元素,然后您可以循环并添加包含重复颜色的下一个元组。
tuples = [('green', 'yellow'),('red', 'orange'),('blue', 'green'),('yellow', 'red'),('black', 'blue')]
sorted_tuples = [tuples[4]]
def sort_tup(original_tup,sort_tup):
for x in original_tup:
if sort_tup[-1][1] == x[0]:
return x
while len(sorted_tuples) < 5:
sorted_tuples.append(sort_tup(tuples,sorted_tuples))
这个丑陋,但没有更多的问题结构,我认为这是一个相当直接的解决方法。