我的最终名单是这样的......添加列表元素
lst = ['Ram:50', 'Ram:80', 'Ram:90', 'Ram:20', 'Sam:40', 'Sam:70', 'Sam:80']
如何所有RAM成一个列表,萨姆全部分离在从Python的另一个列表。
例子:
[50,80,90,20]
[40,70,80]
我的最终名单是这样的......添加列表元素
lst = ['Ram:50', 'Ram:80', 'Ram:90', 'Ram:20', 'Sam:40', 'Sam:70', 'Sam:80']
如何所有RAM成一个列表,萨姆全部分离在从Python的另一个列表。
例子:
[50,80,90,20]
[40,70,80]
([int(x[4:]) for x in l if x[:3] == 'Ram'],
[int(x[4:]) for x in l if x[:3] == 'Sam'])
>>> 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]
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]
也可以使用正则表达式和列表内涵做 -
>>> 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']
这里是一个强大的解决方案。
第一阶段将输入列表转换为[(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']}
>>> 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)
如果列表已经被'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]]
你试过了什么?它非常简单:[迭代列表](http://docs.python.org/tutorial/controlflow.html#for-statements),[拆分字符串](http://docs.python.org/library/ stdtypes.html#str.split),将值添加到相应的列表中。你到底有什么问题? –