2

フォルダー名のリストを1次元配列として持っています:すなわち:

folderList=['A1_001', 'A1_002', 'A1_003', 'A1_004', 
            'A2_001', 'A2_002', 'A2_003', 'A2_004',
            'A3_001', 'A3_002', 'A3_003', 'A3_004']

「A1」、「A2」、「A3」のように、リストを最初の 2 文字でグループ化したいと考えています。これは groupby を使用して行う必要があると考えましたが、コードが機能しません。

sectionName=[] #to get the first two characters of each element into a new list

for file in folderList:
    sectionName.append(file.split('_')[0])

for key, group in groupby(folderList,sectionName): 
    print key
    for record in group:
        print record

エラーが発生しました:

for key, group in groupby(folderList,sectionName):
TypeError: 'list' object is not callable

私が得たいのは、次のような結果です:

A1
['A1_001', 'A1_002', 'A1_003', 'A1_004']

A2
['A2_001', 'A2_002', 'A2_003', 'A2_004']

A3
['A3_001', 'A3_002', 'A3_003', 'A3_004']

この関数は 2 番目の入力をキー関数にする必要があると考えましたgroupbyが、これまでキー関数への実装に失敗していsectionNameました。ご協力いただける場合は、事前に感謝します。

4

4 に答える 4

0
folderList.sort()
def sectionName(sec):
    return sec.split('_', 1)[0]
for key, lst in groupby(folderList, sectionName):
     print key
     for record in lst:
         print record
于 2013-03-23T11:45:13.207 に答える
0
In [40]: folderList=['A1_001', 'A1_002', 'A1_003', 'A1_004','A2_001', 'A2_002', 'A2_003', 'A2_004','A3_001', 'A3_002', 'A3_003', 'A3_004','B1_001','B1_002','B1_003','B2_001','B2_002','B2_003']

In [41]: for k, v in groupby(folderList, lambda x:x[:2]):
    ...:     print k, [x for x in v]
    ...:     
A1 ['A1_001', 'A1_002', 'A1_003', 'A1_004']
A2 ['A2_001', 'A2_002', 'A2_003', 'A2_004']
A3 ['A3_001', 'A3_002', 'A3_003', 'A3_004']
B1 ['B1_001', 'B1_002', 'B1_003']
B2 ['B2_001', 'B2_002', 'B2_003']

または簡単な方法で:

In [42]: result={}

In [43]: for v in folderList:
    ...:     result.setdefault(v[:2],[]).append(v)
    ...:     

In [44]: result
Out[44]: 
{'A1': ['A1_001', 'A1_002', 'A1_003', 'A1_004'],
 'A2': ['A2_001', 'A2_002', 'A2_003', 'A2_004'],
 'A3': ['A3_001', 'A3_002', 'A3_003', 'A3_004'],
 'B1': ['B1_001', 'B1_002', 'B1_003'],
 'B2': ['B2_001', 'B2_002', 'B2_003']}
于 2013-03-23T11:27:41.257 に答える
0

例えば:

grouped = {prefix: list(folders) for 
    prefix, folders in itertools.groupby(folderList, lambda x: x[:2])}

folderListソートする必要のない代替アプローチ:

from collections import defaultdict
grouped = defaultdict(list)
for folder in folderList:
    grouped[folder[:2]].append(folder)
于 2013-03-23T11:28:08.880 に答える
0

単純なループと a でdefaultdict実行できます。

from collections import defaultdict

folderList=['A1_001', 'A1_002', 'A1_003', 'A1_004', 
            'A2_001', 'A2_002', 'A2_003', 'A2_004',
            'A3_001', 'A3_002', 'A3_003', 'A3_004']

sections = defaultdict(lambda: [])
for folder in folderList:
    sections[folder[:2]].append(folder)
print sections.values()

プリント:

[['A1_001', 'A1_002', 'A1_003', 'A1_004'], ['A3_001', 'A3_002', 'A3_003', 'A3_004'], ['A2_001', 'A2_002', 'A2_003', 'A2_004']]

の欠点groupbyは、入力をソートする必要があり、反復子を出力することです。あなたの場合、リストが必要なように聞こえるので、それらを化する追加の手順を実行する必要がありますlist。上記のループは、目的を達成するための簡単な方法です。

于 2013-03-23T11:40:39.213 に答える