如何基于另一个列表创建Python列表

时间:2017-11-13 11:29:57

标签: python python-3.x list

我有一个主列表,然后是从主列表中挑选的一大堆(100s)子列表。但是,随着时间的推移,主列表中的项目将被删除。我还想从每个子列表中删除这些项目。我想有一个列表只是指向主列表的指针。随着指针过时,列表变小。子列表通常位于编辑主列表时不易访问的对象中。这可能吗?

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']

4 个答案:

答案 0 :(得分: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将引发异常。

答案 1 :(得分:1)

需要为其所在的每个列表删除list元素。 您需要做的就是 -

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']

答案 2 :(得分:1)

我为您的问题找到了解决方案,但它没有回答您的问题,因为我没有链接不同的列表。

尽管如此,我建议你这个功能:

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

然后你只需要用你要弹出的项目和你要检查的不同列表来调用这个函数。

希望这可能有用

答案 3 :(得分:0)

由于在没有迭代步骤的情况下以编程方式无法修改列表,我认为使用数据库查询而不是列表数据结构可以更好地解决问题。感谢@DeepSpace提供了一个很好的答案