2017-08-29 24 views
4

我有一個叫做動物列表創建下劃線集列表,如何從一個列表的Python

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

不知道我是否正確表達了這個問題。任何幫助解決這個棘手的問題將不勝感激!

+0

解釋你將如何想象用言語從這裏開始,你會找到幫助。 –

回答

2

可以解開前綴的值和名稱都從一個調用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']}

如果需要,您以後仍然可以解壓詞典到單個變量:

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) 
3

你可以建立單獨的列表,每個首字母一個,但是,如果你有很多字母,這將是棘手。您可以使用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']} 
+0

嘿阿賈克斯,感謝您的幫助!輸出很酷,似乎工作。 – MichaelRSF

+0

@MichaelRSF很樂意幫忙! – Ajax1234

+0

Upvote教我關於'defaultdict' –

2

嘗試的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如何工作的post

+3

這非常簡潔,我直到現在才意識到操作員模塊。謝謝pylang! – MichaelRSF

+0

另一個關鍵選項是一個常規函數,例如'def f(x):x [0]'或者'lambda x:x [0]' – pylang

+0

這將是最後一個可讀性和易於理解,但它絕對勝最短的解決方案;-) –

相關問題