2017-02-19 3 views
0

Я немного новичок в python (2.7), и мне трудно это делать.Как объединить дубликаты в двух списках строк?

У меня есть следующие списки:

animal = ['cat', 'cat', 'dog', 'dog', 'dog', 'horse'] 
names = ['cat_01', 'cat_02', 'dog_01', 'dog_02', 'dog_03', 'horse_01'] 

И я хотел бы иметь следующее (это может быть список кортежей или Dict)

new = {"cat":('cat_01','cat_02'), "dog":('dog_01','dog_02', 'dog_03'), "horse":('horse_01')} 

Как лучше это сделать?

ответ

0

Предполагая, что ваши списки сортируются, как в примере:

Код:

my_dict = {} 
for animal, name in zip(animals, names): 
    my_dict.setdefault(animal, []).append(name) 
print(my_dict) 

Дает:

{'horse': ['horse_01'], 'dog': ['dog_01', 'dog_02', 'dog_03'], 'cat': ['cat_01', 'cat_02']} 

И если вам нужны кортежи не списки:

my_dict = {k: tuple(v) for k, v in my_dict.items()} 
1

Краткое решение с использованием списка понимание:

animal = ['cat', 'cat', 'dog', 'dog', 'dog', 'horse'] 
names = ['cat_01', 'cat_02', 'dog_01', 'dog_02', 'dog_03', 'horse_01'] 
result = {a:tuple([n for n in names if a in n]) for a in animal} 

print result 

Выход:

{'cat': ('cat_01', 'cat_02'), 'horse': ('horse_01',), 'dog': ('dog_01', 'dog_02', 'dog_03')} 
+0

Это приведет к изменению 'str.startwith' для оператора' in'. так как я имею дело с файловыми путями, которые не начинаются со строки, которая мне нужна. В любом случае, спасибо! –

+0

если это так, я изменил этот фрагмент. Это сработает – RomanPerekhrest

1

Вы можете также использовать groupby из itertools

from itertools import groupby 
my_dict = {} 
for key, groups in groupby(zip(animal, names), lambda x: x[0]): 
    my_dict[key] = tuple(g[1] for g in groups) 

Это может быть немного быстрее когда ваш список растет.

Смежные вопросы