클래스 객체로 이해력 나열

Nov 26 2020

subfile.py에 StrucData라는 클래스가 있습니다.

class StrucData:  
def __init__(self, name):
    self.name=name

def loadData(self, size=1, cost=1):
    self.size=size  
    self.cost=cost

기본 파일에서 I :

  1. 서브 파일을 호출하고,
  2. 데이터 이름 목록 생성
  3. 목록을 반복하여 개체를 인스턴스화합니다. 과
  4. 각 개체에 대해 'loadData'메서드를 사용하여 데이터를로드합니다 (이 예제를 쉽게 만들기 위해 동일한 '크기'와 '비용'을 사용하고 있습니다.)
    from subfile import StrucData 

    listIndex=['data1','data2','data3']

    # Create a list of objects
    listObjects=[]

    # Iterate through the list of objects
    for i in range(3):
        data=StrucData(listIndex[i])
        data.loadData(size=3, cost=4)
        listObjects.append(data)

내가하려는 것은 목록 이해력을 사용하여 동일한 작업을 수행하여

listObjects=[object1, object2, object3]

그리고 나는 같은 것을 시도했다

listObjects=[[StrucData(listIndex[i]) for k in range(3)] listObjects[i].loadData(size=3, cost=4) for i in range(3)]]

물론 작동하지 않지만 올바르게 수행하는 방법을 모르겠습니다.

목록 이해력을 사용하여 원하는 출력을 얻기 위해 내 코드에 대한 조언을받을 수 있습니까 ??

답변

1 BillHuang Nov 26 2020 at 19:00

당신은 추가 할 수없는 경우 return self의 마지막 줄 StrucData.loadData()에서 subfile.py이 같이 단순화 될 수 :

# in the main file
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]

그렇지 않으면 loadData()목록 이해 표현식에 대해 아무것도 반환하지 않기 때문에이 작업을 별도로 수행해야합니다 .

listObjects = [StrucData(idx) for idx in listIndex]
for i in range(3):
    listObjects[i].loadData(size=3, cost=4)
2 DavidFrancosCuartero Nov 26 2020 at 19:26

Bill Huang의 응답을 보완하여 객체를 자유롭게 변경할 수없고 두 번 반복하지 않으려면 도우미 함수를 추가 할 수 있습니다.

def load_data(idx, size, cost):
    result = StructData(idx)
    result.loadData(size, cost)
    return result

[load_data(x, size=3, cost=4) for x in range(3)]

참고로, 인스턴스에서 이름과 loadData를 구분할 필요가 없다면 namedtuple을 사용할 수 있습니다.

from collections import namedtuple

StructData = namedtuple('StructData', ['name', 'size', 'cost'])
print([StructData(name=x, size=3, cost=4) for x in range(3)])

Wich는 다음을 반환합니다.

[StructData(name=0, size=3, cost=4), 
 StructData(name=1, size=3, cost=4), 
 StructData(name=2, size=3, cost=4)]

마지막으로 "data1", "data2"와 같은 이름이있는 것을 확인하고이를 클래스 이름으로 사용할 수 있습니다. 이름이 유효한 클래스 식별자 인 한 namedtuple을 사용하여 그렇게 할 수 있습니다.

from collections import namedtuple

list_index = ['data1', 'data2', 'data3']
print([namedtuple(name, ['size', 'cost'])(3, 4) for name in list_index])

결과:

[data1(size=3, cost=4), data2(size=3, cost=4), data3(size=3, cost=4)]