簡體   English   中英

根據 dict 給定的依賴關系,用序列迭代列表

[英]Iterate over list with sequence according to given dependencies from dict

我有一個列表lst ,我想使用 function f迭代地轉換列表中的每個元素:

lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g']

def f(x):
    # do something
    return x

我可以在列表上迭代地應用這個轉換:

new_lst = [f(x) for x in lst]

到目前為止,一切都很好。 現在我們要在lst中引入處理元素的排序。 dict ensure_transformed描述了在處理給定元素之前需要轉換的元素列表:

ensure_transformed = {'a' : ['b', 'e'],
                      'b' : ['e', 'f'],
                      'c' : ['a', 'd'],
                      'd' : [],
                      'e' : [],
                      'f' : []
                      }

解釋是 - 在變換a之前,變換be ,在變換b之前,變換ef等等。

'd': []的含義是在d之前不需要處理任何元素。 ensure_transformed中不存在g意味着不應該轉換g 。)

如何在確保從ensure_transformed排序的同時使用 function f轉換lst

桌上選項:

  1. 通過列表使用遞歸到 go,同時跟蹤已經轉換的元素。 這種方法管理起來很麻煩。

  2. 使用 dict 重新排序列表,然后遍歷列表。 我還沒有嘗試過這種方法,但它似乎很有希望。

我對其他方法持開放態度。

ensure_transformed字典描述了一個有向圖,其中{'a': ['b', 'e']}表示存在邊b → a和邊e → a

假設該圖沒有環,您的任務相當於對其應用拓撲排序,您可以找到各種算法。

正如@CristianCiupitu 在評論中提到的那樣,現在使用graphlib模塊很容易用Python 3.9 完成:

import graphlib
lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g']

def f(x): return x.upper() #for example

ensure_transformed = {'a' : ['b', 'e'],
                      'b' : ['e', 'f'],
                      'c' : ['a', 'd'],
                      'd' : [],
                      'e' : [],
                      'f' : []
                      }

ts = graphlib.TopologicalSorter(ensure_transformed)

processed = [f(x) for x in ts.static_order()]
print(processed)
#prints ['E', 'F', 'D', 'B', 'A', 'C']

暫無
暫無

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

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