-3

私の最終的なリストはこのようなものです...

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

すべてのRamを1つのリストに分割し、すべてのSamをPythonの別のリストに分割する方法。

例:

[50,80,90,20]
[40,70,80] 
4

7 に答える 7

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)
于 2012-05-07T11:37:26.857 に答える
2

リスト内包表記の使用:

>>> 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]
于 2012-05-07T11:05:44.620 に答える
1
([int(x[4:]) for x in l if x[:3] == 'Ram'],
 [int(x[4:]) for x in l if x[:3] == 'Sam'])
于 2012-05-07T11:05:42.200 に答える
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')]

2 番目のフェーズでは、そのようなリストを反復処理し、storedict に入力します。キーが存在しない場合は、キーにマップする (1 つの要素の) リストを作成します。それ以外の場合は、そのリストに追加します

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']}
于 2012-05-07T11:15:41.140 に答える
0
Ram = map(lambda y: int(y[y.find(":")+1:]), filter(lambda x: x[:x.find(":")] == "Ram", lst))

root45 のソリューションは似ていますが、はるかに簡単です。

1日後に戻って、一般的な知恵を要約します。

for name in ('Ram', 'Sam'):
    globals()[name] = [int(x[x.find(":")+1:]) for x in lst if x[:x.find(":")] == name]
于 2012-05-07T11:08:22.230 に答える
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]]
于 2012-05-07T12:05:15.627 に答える
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']
于 2012-05-07T11:14:09.413 に答える