Python 使用一个列表的值对第二个列表进行分组

Python 使用一个列表的值对第二个列表进行分组,python,Python,假设我有这样的数据: Owners = ('Bob', 'Bob', 'Bob', 'Jeff', 'Jeff', 'Mary', 'Ana') Pets = ('Snake', 'Bird', 'Cat', 'Dog', 'Cat', 'Bird', 'Cat') 每个名字都对应于他们自己的动物。 我想根据所有者创建列表列表: PetsByOwner = [(Snake, Bird, Cat), (Dog, Cat), (Bird), (Cat)] PetsByOwner= [] for

假设我有这样的数据:

Owners = ('Bob', 'Bob', 'Bob', 'Jeff', 'Jeff', 'Mary', 'Ana')
Pets = ('Snake', 'Bird', 'Cat', 'Dog', 'Cat', 'Bird', 'Cat')
每个名字都对应于他们自己的动物。 我想根据所有者创建列表列表:

PetsByOwner = [(Snake, Bird, Cat), (Dog, Cat), (Bird), (Cat)]


PetsByOwner= []
for i in Owners:
    if PetsByOwner and PetsByOwner[-1][0] == i:
        PetsByOwner[-1].append(value)
    else:
        PetsByValue.append([value])
我试过了,但这只会让主人分崩离析,而不会让宠物分崩离析。如何连接第二个列表?
任何帮助都将不胜感激。

您可以使用
集合。defaultdict

import collections
Owners = ('Bob', 'Bob', 'Bob', 'Jeff', 'Jeff', 'Mary', 'Ana')
Pets = ('Snake', 'Bird', 'Cat', 'Dog', 'Cat', 'Bird', 'Cat')
d = collections.defaultdict(list)
for a, b in zip(Owners, Pets):
  d[a].append(b)
final_result = {a:tuple(b) for a, b in d.items()}
输出:

{'Bob': ('Snake', 'Bird', 'Cat'), 'Jeff': ('Dog', 'Cat'), 'Mary': ('Bird',), 'Ana': ('Cat',)}
[('Snake', 'Bird', 'Cat'), ('Dog', 'Cat'), ('Bird',), ('Cat',)]
{'Bob': ('Snake', 'Bird', 'Cat'), 'Jeff': ('Dog', 'Cat'), 'Mary': ('Bird',), 'Ana': ('Cat',)}

您可以使用
itertools
中的
groupby

from itertools import groupby

Owners = ('Bob', 'Bob', 'Bob', 'Jeff', 'Jeff', 'Mary', 'Ana')
Pets = ('Snake', 'Bird', 'Cat', 'Dog', 'Cat', 'Bird', 'Cat')

print([tuple(v) for g, v in groupby(Pets, key=lambda v, c=iter(Owners): next(c))])
输出:

{'Bob': ('Snake', 'Bird', 'Cat'), 'Jeff': ('Dog', 'Cat'), 'Mary': ('Bird',), 'Ana': ('Cat',)}
[('Snake', 'Bird', 'Cat'), ('Dog', 'Cat'), ('Bird',), ('Cat',)]
{'Bob': ('Snake', 'Bird', 'Cat'), 'Jeff': ('Dog', 'Cat'), 'Mary': ('Bird',), 'Ana': ('Cat',)}
如果要将所有者添加到结果中

print({g: tuple(v) for g, v in groupby(Pets, key=lambda v, c=iter(Owners): next(c))})
印刷品: