Python 如何从列表中创建带下划线的子集列表

Python 如何从列表中创建带下划线的子集列表,python,list,subset,list-comprehension,Python,List,Subset,List Comprehension,我有一张叫做动物的名单 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"] 我只能得到字母或动物的子

我有一张叫做动物的名单

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']

我不确定我的问题措辞是否正确。如果您能帮助解决这个棘手的问题,我们将不胜感激

您可以建立单独的列表,每个首字母对应一个列表,但是,如果您有许多字母,这将是一个棘手的问题。您可以改用
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']}

您可以将前缀和名称的值从对
拆分的一次调用中解包:

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

print groups
{'A':['A_猫','A_狗','A_鼠'],'C':['C_鸭','C_狐','C_鸟'],'B':['B_狐','B_狗','B_鼠']]

如果需要,您以后仍然可以将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)

根据第一个字母尝试
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如何工作的示例。

用文字解释您如何想象从这里开始,您会找到帮助。嘿,Ajax,谢谢您的帮助!“输出很酷,似乎可以工作。”MichaelRSF很乐意帮忙!这很好,我直到现在才意识到操作员模块。谢谢皮朗!另一个关键选项是常规函数,例如
def(x):x[0]
lambda x:x[0]
这将是可读性和易理解性的最后一个选项,但它肯定会赢得最短解决方案;-)@Hubert Grzeskowiak,我可能同意这样的理解,
groupby
就是这样。这是一种更难、更棘手的ITERTOOL。但是,我认为它读起来不错。为了清晰起见,我将添加一个链接。谢谢。也谢谢你的解决方案,休伯特!非常感谢您的帮助:)