У меня есть список животных

animals = ["B_FOX", "A_CAT", "A_DOG", "A_MOUSE", 
         "B_DOG", "B_MOUSE", "C_DUCK", "C_FOX", "C_BIRD"]

И хотел бы следующие результаты:

 A = ["A_CAT", "A_DOG", "A_MOUSE"]
 B = ["B_DOG", "B_MOUSE", "B_FOX"]
 C = ["C_DUCK", "C_FOX", "C_BIRD"]

Я могу получить только подмножество списка только букв или животных, как это:

  [species.split("_",1)[1] for species in animals]
  ['FOX', 'CAT', 'DOG', 'MOUSE', 'DOG', 'MOUSE', 'DUCK', 'FOX', 'BIRD']

  [letters.split("_",1)[0] for letters in animals]
  ['B', 'A', 'A', 'A', 'B', 'B', 'C', 'C', 'C']

Не уверен, правильно ли я сформулировал вопрос. Любая помощь в решении этой сложной проблемы будет принята с благодарностью!

4
MichaelRSF 29 Авг 2017 в 05:39

3 ответа

Лучший ответ

Вы можете распаковать значения префикса и имени из одного вызова split:

groups = {}
for animal in animals:
    prefix, name = animal.split("_")
    if prefix not in groups:
        groups[prefix] = []
    groups[prefix].append(animal)

print groups

{'A': ['A_CAT', 'A_DOG', 'A_MOUSE'], 'C': ['C_DUCK', 'C_FOX', 'C_BIRD'], 'B': ['B_FOX', 'B_DOG', ' B_MOUSE '] }

При необходимости вы можете позже распаковать dict в отдельные переменные:

A = groups["A"]
B = groups["B"]
C = groups["C"]

Если вы хотите избавиться от префиксов:

groups = {}
for animal in animals:
    prefix, name = animal.split("_")
    if prefix not in groups:
        groups[prefix] = []
    groups[prefix].append(name)
2
Hubert Grzeskowiak 29 Авг 2017 в 03:04

Попробуйте itertools.groupby в соответствии с первой буквой:

import operator as op
import itertools as it


animals = [
    "B_FOX", "A_CAT", "A_DOG", "A_MOUSE", 
    "B_DOG", "B_MOUSE", "C_DUCK", "C_FOX", "C_BIRD"
]

A, B, C = [list(g) for _, g in it.groupby(sorted(animals), key=op.itemgetter(0))]

Выходы:

A
# ['A_CAT', 'A_DOG', 'A_MOUSE']

B
# ['B_DOG', 'B_FOX', 'B_MOUSE']

C
# ['C_BIRD', 'C_DUCK', 'C_FOX']

Вот сообщение о том, как groupby работает.

2
pylang 29 Авг 2017 в 03:23

Вы можете создать отдельные списки, по одному на каждую начальную букву, однако это будет сложно, если у вас много букв. Вместо этого вы можете использовать defaultdict:

from collections import defaultdict

d = defaultdict(list)
animals = ["B_FOX", "A_CAT", "A_DOG", "A_MOUSE", 
     "B_DOG", "B_MOUSE", "C_DUCK", "C_FOX", "C_BIRD"]

for animal in animals:
   d[animal[0]].append(animal)
print(dict(d))

Выход:

{'A': ['A_CAT', 'A_DOG', 'A_MOUSE'], 'C': ['C_DUCK', 'C_FOX', 'C_BIRD'], 'B': ['B_FOX', 'B_DOG', 'B_MOUSE']}
3
Ajax1234 29 Авг 2017 в 02:43