2017-11-03 7 views
2

私は、多くの行と2つの列を持つ2D配列を持っています。この2D配列のすべての行を抽出します。最初の列には、リスト内のいずれかの部分文字列に一致する文字列があります。正規表現の一致に基づいてPythonで2Dリストをスライスする

下記のような実例をご覧ください。

students_mat = [['Ant', 'Bat', 'Cat', 'Dog', 'Ear'] , [3.75, 4.32, 2.43, 3.73, 2.51]] 


subset_ids = ['A', 'B', 'E'] 

私はそれが1次元リストのために働くものの、出力

accepted_std = [['Ant', 'Bat', 'Ear'] , [3.75, 4.32, 2.51]] 

は、私は、これは動作しません

accepted_std = [s for s in students_mat if any(xs in s for xs in subset_ids)] 

を試したいです。あなたはこれを試すことができ

おかげ&よろしく、 santosh

+1

'[3.75,4.32,2.43,3.73,2.51] 'には含まれていません。これらの要素をフィルタリングするためのルールは何ですか? – Ajax1234

答えて

0

students_mat = [['Ant', 'Bat', 'Cat', 'Dog', 'Ear'] , [3.75, 4.32, 2.43, 3.73, 2.51]] 
subset_ids = ['A', 'B', 'E'] 
indicies = [i for i, a in enumerate(students_mat[0]) if a[0] in subset_ids] 
final_data = [[c for i, c in enumerate(a) if i in indicies] for a in students_mat] 

出力:

[['Ant', 'Bat', 'Ear'], [3.75, 4.32, 2.51]] 
0

あなたが翻訳し、その後、タプルのリストの中に二つのリストを変換する必要がありますそれらは2つのリストに戻ります:

accepted_std = zip(* 
    [ 
    (txt, num) for (txt, num) in zip(students_mat[0], students_mat[1]) 
    if any(xs in txt for xs in subset_ids) 
] 
) 

あなたはzipコマンドを使用して単純なリストからタプルのリストを作成できます。

for (txt, num) in zip(students_map[0], students_map[1]) 

次にあなたが前にしていたのと同じ方法を使用してtxt変数にフィルタを適用することができます

最後に
if any(xs in txt for xs in subset_ids) 

タプルのリストを解凍する必要があります。 zip(*list)はまさにそのためのものです。

2
students_mat = [['Ant', 'Bat', 'Cat', 'Dog', 'Ear'] , [3.75, 4.32, 2.43, 3.73, 2.51]] 
subset_ids = ['A', 'B', 'E'] 

# we need corresponding pairs from first and second subarrays 
pairs = zip(*students_mat) 

# filtering 
filtered_pairs = ((x, y) for x, y in pairs if x[0] in subset_ids) 

# returning to original form 
original = zip(*filtered_pairs) 

# converting to list of lists 
accepted_std = list(map(list, original)) 
関連する問題