说我有这样的数据:
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])
我尝试过,但这只会破坏主人,而不是宠物。如何连接第二个列表? 任何帮助将不胜感激。
答案 0 :(得分:1)
您可以使用collections.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',)}
答案 1 :(得分:1)
您可以使用groupby
中的itertools
:
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))])
输出:
[('Snake', 'Bird', 'Cat'), ('Dog', 'Cat'), ('Bird',), ('Cat',)]
如果要将所有者添加到结果中
print({g: 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',)}
答案 2 :(得分:0)
为大数据帧提供pandas
解决方案总是很好
df = pd.DataFrame({'O':Owners, 'P':Pets})
df.groupby('O').P.agg(tuple).to_dict()
输出
{'Ana': ('Cat',),
'Bob': ('Snake', 'Bird', 'Cat'),
'Jeff': ('Dog', 'Cat'),
'Mary': ('Bird',)}