[英]Python - iterate over two object lists and get the parent instances name
首先請看下面的示例代碼:
class A:
def __init__(self):
self.folder = 'some/path/'
self.files = ['name1.txt', 'name2.txt', 'name3.txt']
class B:
def __init__(self):
self.folder = 'somewhere/else/'
def locals(self):
b1 = 'name4.txt'
b2 = 'name5.txt'
return [b1, b2]
aa = A()
bb = B()
for objname, filename in chain(*[aa.files, bb.locals()]):
print(filename, objname, objname.folder)
循環不起作用,但只是指向我正在尋找的東西......
有沒有辦法遍歷兩個列表並在迭代過程中獲取項目各自的文件夾?
就上述例子而言,我希望如下:
'name1.txt', 'A()', 'some/path/'
'name2.txt', 'A()', 'some/path/'
'name3.txt', 'A()', 'some/path/'
'name4.txt', 'B()', 'somewhere/else/'
'name5.txt', 'B()', 'somewhere/else/'
aa.files
和bb.locals()
的不同結構是故意的,無法更改。
顯然,我可以(並且目前正在這樣做)首先循環遍歷aa.files
然后在bb.locals()
上執行相同的循環,但可能有更優雅的解決方案?!
謝謝你的幫助。
你可以這樣做:
from itertools import chain, repeat
for (obj,fname) in chain(zip(repeat(aa),aa.files),zip(repeat(bb),bb.locals())):
print (f"{repr(fname)}, '{'A()' if isinstance(obj,A) else 'B()'}', {repr(obj.folder)}")
輸出:
'name1.txt', 'A()', 'some/path/'
'name2.txt', 'A()', 'some/path/'
'name3.txt', 'A()', 'some/path/'
'name4.txt', 'B()', 'somewhere/else/'
'name5.txt', 'B()', 'somewhere/else/'
更新(羅伯特) -建議更適合我的需求來塑造解決方案
for (obj,fname) in chain(zip(repeat(aa),aa.files),zip(repeat(bb),bb.locals())):
print (f"{repr(fname)}, {obj.__class__.__name__}, {repr(obj.folder)}")
原則上,我只需要再次訪問 obj 。 感謝您的解決方案!!
一種方法是為兩者定義__iter__
方法,如下所示:
class A:
...
def __iter__(self):
for file in self.files:
yield file, 'A()', self.folder
...
class B:
...
def __iter__(self):
for file in self.locals():
yield file, 'B()', self.folder
...
# Example usage
list(A())
# [('name1.txt', 'A()', 'some/path/'), ('name2.txt', 'A()', 'some/path/'), ('name3.txt', 'A()', 'some/path/')]
list(B())
# [('name4.txt', 'B()', 'somewhere/else/'), ('name5.txt', 'B()', 'somewhere/else/')]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.