2017-11-13 10 views
3

나는 마스터 목록을 갖고 있으며 마스터 목록에서 전체 목록 (100s)의 하위 목록을 cherry-picked했습니다. 그러나 시간이 지남에 따라 마스터 목록의 항목이 제거됩니다. 각 하위 목록에서 해당 항목을 제거하고 싶습니다. 나는 마스터리스트에 대한 포인터 일 뿐이라고 생각한다. 포인터가 오래되면 목록이 작아집니다. 하위 목록은 일반적으로 마스터 목록을 편집 할 때 쉽게 액세스 할 수없는 개체에 있습니다. 이것이 가능한가?다른 목록을 기반으로 파이썬 목록을 만드는 방법

master = ["first","last","middle","top","bottom","left","right","inside"] 

sides = [] 
sides.append(master[2]) 
sides.append(master[3]) 
sides.append(master[4]) 

centre = [] 
centre.append(master[0]) 
centre.append(master[2]) 
centre.append(master[7]) 

print(master) 
['first', 'last', 'middle', 'top', 'bottom', 'left', 'right', 'inside'] 
print(sides) 
['middle', 'top', 'bottom'] 
print(centre) 
['first', 'middle', 'inside'] 

master.remove("middle") 

print(master) 
['first', 'last', 'top', 'bottom', 'left', 'right', 'inside'] 
print(sides) # Ideal outcome 
['top', 'bottom'] 
print(centre) # Ideal outcome 
['first', 'inside'] 

답변

2

당신은 list을 하위 클래스 사용자 정의 클래스를 사용할 수 있습니다. 이렇게하면의 행동을 조정할 수 있습니다. remove :

class Lists(list): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

     # logic here, for now using the whole passed list 
     self.sides = self[:] 
     self.center = self[:] 

    def remove(self, obj): 
     # TODO catch ValueError that is raised if obj isn't in all of the lists 
     super().remove(obj) 
     self.sides.remove(obj) 
     self.center.remove(obj) 

    # probably overriding other methods from list, such as append, so 
    # an instance can be used directly to interact with the "master" list 

my_lists = Lists(["first", "last", "middle", "top", "bottom", "left", "right", "inside"]) 

print(my_lists) 
my_lists.remove('last') 
print(my_lists) 
print(my_lists.sides) 
print(my_lists.center) 

# ['first', 'last', 'middle', 'top', 'bottom', 'left', 'right', 'inside'] 
# ['first', 'middle', 'top', 'bottom', 'left', 'right', 'inside'] 
# ['first', 'middle', 'top', 'bottom', 'left', 'right', 'inside'] 
# ['first', 'middle', 'top', 'bottom', 'left', 'right', 'inside'] 

필요한 경우 (인 - 코드 주석에서 알 수 있듯이) 또한 더 나은 .master을 캡슐화 할 수있다.


그러나 문제와 해결 방법을 다시 생각해 볼 수 있습니다. 원래 목록의 하위 목록을 유지하는 것보다 더 좋은 방법이있을 수 있으며 목록에서 존재하지 않는 요소를 삭제하려고 시도하면 .remove이 예외를 발생시킵니다. .

+0

'list' 하위 클래스가 필요한 이유는 무엇입니까? 'list' 유형에 의해 제공된 메소드 나 속성을 사용하지 않습니다. – vaultah

+0

@vaultah 1. 나는 '제거'를 무시하고 있습니다. 2. OP는'append'를 오버라이드 (override)하여'my_lists.master.append' 대신에'.master'에 직접 추가 할 수 있습니다. – DeepSpace

+0

나는이 목록에 배열을 만들 수 있다고 가정합니다. 배열에 하위 목록을 추가하고 제거하기 위해 루프를 반복하는 함수가 있어야합니다. – Mark

1

목록 요소는 가에있는 모든 목록을 제거하는 것입니다 당신이 이것을 구현하기 위해 필요한 모든 필요 -

print(master) 
['first', 'last', 'middle', 'top', 'bottom', 'left', 'right', 'inside'] 
print(sides) 
['middle', 'top', 'bottom'] 
print(centre) 
['first', 'middle', 'inside'] 

master.remove("middle") 
sides.remove("middle") 
centre.remove("middle") 

print(master) 
['first', 'last', 'top', 'bottom', 'left', 'right', 'inside'] 
print(sides) # Ideal outcome 
['top', 'bottom'] 
print(centre) # Ideal outcome 
['first', 'inside'] 
+0

그건 분명하고 나는 더 이해할 수 있도록 내 질문을 변경합니다. – Mark

1

내가 당신의 문제에 대한 해결책을했다,하지만 아무튼 내가 다른 목록을 연결하지 않았으므로 당신의 질문에 대답하지 마라.

def del_item(item, *args) : 
    for lst in args : 
     if item in lst : 
      lst.remove(item) 

그런 다음 당신은 당신이 튀어 할 항목 및 검사 할 다른 목록과이 함수를 호출 할 수 있습니다

그럼에도 불구하고, 나는 당신에게이 기능을 제안한다. 수정 목록은 내가 문제가 더 나은 데이터베이스 쿼리보다는 목록 데이터 구조를 사용하여 응답 생각 반복적 인 단계없이 프로그래밍 방식으로 가능하지 않았다으로

희망이

0

유용 할 수 있습니다. 감사합니다 @DeepSpace 좋은 답변을 위해

관련 문제