像这样排序'端到端':[[a,b] [b,c] [c,e]]

时间:2018-03-25 23:14:59

标签: python arrays list sorting

如何对这样的数组列表进行排序:

    ((green, yellow]),
    (red, orange),
    (blue, green),
    (yellow, red),
    (black, blue))

这样两个元素首尾相连,如下所示:

    ((black, blue),
    (blue, green),
    (green, yellow),
    (yellow, red),
    (red, orange))

2 个答案:

答案 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))

这个丑陋,但没有更多的问题结构,我认为这是一个相当直接的解决方法。