簡體   English   中英

Python - 遍歷兩個對象列表並獲取父實例名稱

[英]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.filesbb.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.

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