Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:使用迭代器模块的多对多分组_Python_Iterator - Fatal编程技术网

python:使用迭代器模块的多对多分组

python:使用迭代器模块的多对多分组,python,iterator,Python,Iterator,我有一个iterable,其中的项映射到多个组。如何使用迭代器模块对项目进行分组 animals = (human, frog, giraffe, fish) 在这里,人、青蛙等是具有属性的对象:是陆地、是水、是住宅 我想根据这些属性对动物进行分组 groupings = dwelling_classifier(animals) 应该返回一些分组迭代器,将动物拆分为 is_land_dwelling: human, frog, giraffe is_water_dwelling: frog,

我有一个iterable,其中的项映射到多个组。如何使用迭代器模块对项目进行分组

animals = (human, frog, giraffe, fish)
在这里,人、青蛙等是具有属性的对象:是陆地、是水、是住宅

我想根据这些属性对动物进行分组

groupings = dwelling_classifier(animals)
应该返回一些分组迭代器,将动物拆分为

is_land_dwelling: human, frog, giraffe
is_water_dwelling: frog, fish
我宁愿只通过iterable一次。那么,除了编写自定义迭代器函数外,还有其他方法吗

def is_water_dwelling(animal):
    return animal in ('frog', 'fish')


def is_land_dwelling(animal):
    return animal in ('frog', 'human', 'giraffe')

animals = ('human', 'frog', 'fish', 'giraffe')

land_dwelling = (x for x in animals if is_land_dwelling(x))
water_dwelling = (x for x in animals if is_water_dwelling(x))

print list(land_dwelling)
print list(water_dwelling)
请注意,
陆上住宅
水上住宅
是发电机

这可以推广到任何数量的“分类器”,通过在某种类型的词典中保存相关的分类函数,可能由分类类型键入。类似于此(未经测试):

请注意,
陆上住宅
水上住宅
是发电机

这可以推广到任何数量的“分类器”,通过在某种类型的词典中保存相关的分类函数,可能由分类类型键入。类似于此(未经测试):


你能再详细一点吗?这是非常重要的sketchy@Jakob,我对示例进行了修改,使其更清晰。因此,每个“分类”都会返回几个类?@Eli,我的示例不太好。人类,青蛙不是类,只是简单的物体。U分类器与iterator.groupby类似,不同之处在于它不是将一个项目仅分类为一个组,而是将其分为多个组。请参阅我更新的答案。据我所知,Python/stdlib中没有这样的内置代码,但是它很容易实现。您能提供更多的细节吗?这是非常重要的sketchy@Jakob,我对示例进行了修改,使其更清晰。因此,每个“分类”都会返回几个类?@Eli,我的示例不太好。人类,青蛙不是类,只是简单的物体。U分类器与iterator.groupby类似,不同之处在于它不是将一个项目仅分类为一个组,而是将其分为多个组。请参阅我更新的答案。据我所知,Python/stdlib中没有这样的内置代码,但是很容易实现。我的问题是一个项目属于多个组。因此,groupby迭代器将无法正常工作。参考你的例子,我的项目是假的和真的。所以,它属于两组。你的答案很好。我更喜欢单程通过iterable。我会相应地更新这个问题。@Salil:如果你想只通过一次iterable,你必须检查每个
x
的所有分类器,所以这是这个方法的一个简单变体-更新的答案谢谢你的回答。使用defaultdict的自定义迭代器是一种很好的方法。我的问题是一个项属于多个组。因此,groupby迭代器将无法正常工作。参考你的例子,我的项目是假的和真的。所以,它属于两组。你的答案很好。我更喜欢单程通过iterable。我会相应地更新这个问题。@Salil:如果你想只通过一次iterable,你必须检查每个
x
的所有分类器,所以这是这个方法的一个简单变体-更新的答案谢谢你的回答。使用defaultdict的自定义迭代器是一种很好的方法。
kinds = {'water': is_water_dwelling, 'land': is_land_dwelling, 'air': is_flying}
result = {}

for kind, classifier in kinds.iteritems():
  result[kind] = [x for x in animals if classifier(x)]

# If you just want to go over animals once, you can do this instead:
from collections import defaultdict
result = defaultdict(list)

for x in animals:
  for kind, classifier in kinds.iteritems():
    if classifier(x):
      result[kind].append(x)