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。但是,我认为它读起来不错。为了清晰起见,我将添加一个链接。谢谢。也谢谢你的解决方案,休伯特!非常感谢您的帮助:)