簡體   English   中英

在元組列表中查找具有連續值的元組並將它們變成更大的元組

[英]Find tuples in a list of tuples, with consecutive values and turn them into bigger tuples

我有一個元組列表,每個元組都有兩個元素。 例子:

my_tuples = [('black', 'grey'), ('red', 'orange'), ('blue', 'purple'), 
             ('orange', 'yellow'), ('grey', 'white'), ('yellow', 'cream')]

我正在尋找一種有效的方法來查找其第一個值與另一個元組的第二個值相同的所有元組,將它們組成三元組,並繼續以這種方式添加值,直到找到所有這樣的鏈。 在此示例中,它應該返回以下列表:

my_tuples_processed = [('black', 'grey', 'white'), ('blue', 'purple'), 
                       ('red', 'orange', 'yellow', 'cream')]

對此的任何幫助將不勝感激。

使用字典有效地查找起始值和連接,並使用列表有效地連接值( 在線嘗試! ):

my_tuples_processed = []
d = dict(my_tuples)
for x in d.keys() - d.values():
    path = [x]
    while x in d:
        path.append(x := d[x])
    my_tuples_processed.append(tuple(path))

這假設沒有任何值出現兩次是第一個值或第二個值的兩倍(如問題評論中所討論的)。

迭代器的替代品主要是因為我喜歡迭代器( 在線嘗試! ):

my_tuples_processed = []
d = dict(my_tuples)
def get():
    global x
    return (x := d.get(x))
for x in d.keys() - d.values():
    path = x, *iter(get, None)
    my_tuples_processed.append(path)

在發布這個問題之前,我添加了我自己的原始解決方案,只是為了完整起見。 但這並不是一個真正有效的解決方案,而且公認的答案更可取。

def sort_merge_tuples(list_tuples):
    my_tuples = list_tuples.copy()
    cc1 = 0
    while cc1 < len(my_tuples):
        my_t = my_tuples[cc1]
        cc2 = 0
        while cc2 < len(my_tuples):
            my_t2 = my_tuples[cc2]
            if my_t[-1] == my_t2[0]:
                new_tuple = my_t + my_t2[1:]
                my_tuples.remove(my_t)
                my_tuples.remove(my_t2)
                my_tuples.append(new_tuple)
                cc1 = 0
                break
            elif my_t2[-1] == my_t[0]:
                new_tuple = my_t2 + my_t[1:]
                my_tuples.remove(my_t)
                my_tuples.remove(my_t2)
                my_tuples.append(new_tuple)
                cc1 = 0
                break
            cc2 = cc2 + 1
        cc1 = cc1 + 1
    return my_tuples

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM