[英]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
之前,變換b
和e
,在變換b
之前,變換e
和f
等等。
( 'd': []
的含義是在d
之前不需要處理任何元素。 ensure_transformed
中不存在g
意味着不應該轉換g
。)
如何在確保從ensure_transformed
排序的同時使用 function f
轉換lst
?
桌上選項:
通過列表使用遞歸到 go,同時跟蹤已經轉換的元素。 這種方法管理起來很麻煩。
使用 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.