2012-05-07 196 views
-3

我的最終名單是這樣的......添加列表元素

lst = ['Ram:50', 'Ram:80', 'Ram:90', 'Ram:20', 'Sam:40', 'Sam:70', 'Sam:80'] 

如何所有RAM成一個列表,薩姆全部分離在從Python的另一個列表。

例子:

[50,80,90,20] 
[40,70,80] 
+2

你試過了什麼?它非常簡單:[迭代列表](http://docs.python.org/tutorial/controlflow.html#for-statements),[拆分字符串](http://docs.python.org/library/ stdtypes.html#str.split),將值添加到相應的列表中。你到底有什麼問題? –

回答

1
([int(x[4:]) for x in l if x[:3] == 'Ram'], 
[int(x[4:]) for x in l if x[:3] == 'Sam']) 
2

使用list comprehensions

>>> l = ['Ram:50', 'Ram:80', 'Ram:90','Ram:20', 'Sam:40', 'Sam:70', 'Sam:80'] 
>>> [int(x[4:]) for x in l if x.startswith('Ram:')] 
[50, 80, 90, 20] 
>>> [int(x[4:]) for x in l if x.startswith('Sam:')] 
[40, 70, 80] 
0
Ram = map(lambda y: int(y[y.find(":")+1:]), filter(lambda x: x[:x.find(":")] == "Ram", lst)) 

我看到剛纔root45的解決方案是相似的,但要容易得多。

回到一天後總結共同智慧:

for name in ('Ram', 'Sam'): 
    globals()[name] = [int(x[x.find(":")+1:]) for x in lst if x[:x.find(":")] == name] 
0

也可以使用正則表達式和列表內涵做 -

>>> list = ['Ram:50', 'Ram:80', 'Ram:90', 'Ram:20', 'Sam:40', 'Sam:70', 'Sam:80'] 
>>> [re.findall(r'[0-9]*$',s)[0] for s in list if 'Ram' in s] 
['50', '80', '90', '20'] 
>>> [re.findall(r'[0-9]*$',s)[0] for s in list if 'Sam' in s] 
['40', '70', '80'] 
0

這裏是一個強大的解決方案。

第一階段將輸入列表轉換爲[(key,value),(key,value)...]形式的元組列表。 map操作在此處使用分割功能執行此轉換。

l = ['Ram:50', 'Ram:80', 'Ram:90', 'Ram:20', 'Sam:40', 'Sam:70', 'Sam:80'] 

def split(input): 
    sp = input.split(":") 
    return (sp[0], sp[1]) 
l2 = map(split, l) 
print l2 

#[('Ram', '50'), ('Ram', '80'), ('Ram', '90'), ('Ram', '20'), ('Sam', '40'), ('Sam', '70'), ('Sam', '80')] 

在這樣的列表中的第二階段迭代並填充store字典。如果密鑰不存在,它將創建一個映射到密鑰的列表(一個元素)。否則,將它添加到這個列表

store = {} 
for i in l2: 
    key, value = i[0], i[1] 
    if key not in store.keys(): 
     store[key] = [value] 
    else: 
     store[key].append(value) 

print store 
#{'Ram': ['50', '80', '90', '20'], 'Sam': ['40', '70', '80']} 
2
>>> lis = ['Ram:50', 'Ram:80', 'Ram:90','Ram:20', 'Sam:40', 'Sam:70', 'Sam:80'] 
>>> D = {'Ram':[], 'Sam':[]} 
>>> for k,v in (x.partition(':')[::2] for x in lis): 
... D[k].append(v) 
... 
>>> D['Ram'] 
['50', '80', '90', '20'] 
>>> D['Sam'] 
['40', '70', '80'] 

更高級一些的是初始化d這樣

D = collections.defaultdict(list) 
+0

如果名字是'Ramu'和'Sam',那麼**不會**需要根本改變。 – aitchnyu

+0

爲什麼在'split'上使用'partition'? – jamylak

+0

@jamylak,如果分隔符不存在,分區將不會失敗。通常它比拆分稍快 –

0

如果列表已經被'ram'下令然後'sam'你可以做到這一點

>>> from itertools import groupby 
>>> from operator import itemgetter 
>>> lst = ['Ram:50', 'Ram:80', 'Ram:90', 'Ram:20', 'Sam:40', 'Sam:70', 'Sam:80'] 
>>> [[int(y) for x,y in v] for k,v in groupby((el.split(':') for el in lst),itemgetter(0))] 
[[50, 80, 90, 20], [40, 70, 80]]