检查列表中是否存在一个实例,然后将该实例添加到另一个列表中



我有以下实例列表:

diamondlist = []
goldlist = []
mylist = [Diamond((1, 2)), Gold((3, 4)), Diamond((2,3))]

我想遍历这个列表,检查列表是否包含某个项目的特定实例,然后将该特定实例添加到另一个列表中。

例如,在遍历列表之后,我希望有两个独立的列表:

diamondlist = [Diamond((1,2)), Diamond((2,3))]
goldlist = [Gold((3, 4))]

我真的不知道如何开始编码,但这是我目前所拥有的。注意:我使用'diamondInstance'作为占位符,因为我不知道这里应该去什么。

if diamondInstance in mylist:
diamondlist.append(diamondInstance)

那么我就为Gold重复这个代码。提前谢谢你

从您的预期结果来看,isinstance()是您所需要的。

diamondlist = []
goldlist = []
mylist = [Diamond((1, 2)), Gold((3, 4)), Diamond((2, 3))]
for item in mylist:
if isinstance(item, Diamond):
diamondlist.append(item)
elif isinstance(item, Gold):
goldlist.append(item)

假设classes "Diamond"one_answers";Gold"(等)的定义如下

class Thing():
def __init__(self,v): self.v = v
def __repr__(self  ): return '{0}({1})'.format(type(self).__name__,self.v)
class Diamond(Thing): pass
class Gold   (Thing): pass
...

时,可以遍历具有任意数量每个类实例的任意列表,并使用以下例程根据类名构建映射。

import collections  # to use 'defaultdict', which comes in handy
def mapbytype(mylist):
mappedbytype = collections.defaultdict(lambda: list())
for element in mylist:
mappedbytype[type(element).__name__].append(element)
return mappedbytype

结果是dict(collections.defaultdict),其中

  • 每个键为类名;
  • 每个值都是从该类创建的实例列表。

下面是一些可以尝试的示例和一个函数,用于美观地打印结果。

def printresult(dictoflists): print('n'.join('    {0}{1}: {2}'.format(k,(10-len(k))*' ',', '.join(map(repr,l))) for k,l in dictoflists.items()))
print('Example 1')
printresult(mapbytype([Diamond((1, 2)), ]))
print('Example 2') # your original example
printresult(mapbytype([Diamond((1, 2)), Gold((3, 4)), Diamond((2,3)), ]))
print('Example 3')
printresult(mapbytype([Diamond((1, 2)), Gold((3, 4)), Diamond((2,3)), Silver((0,0)), Bronze((-1,-2)), ]))

最新更新