2016-11-04 12 views
-2

配列内の大量のデータを整理して分析しようとしています。しかし、私のコードは、私が望むように機能しているようには見えません。私は出力1の再利用可能なアレイに配列A(データアレイ)とB(参照配列)を使用しようとしてい複数の配列の解析

、C.

入力配列:

A = [1 A B, 1 C D, 1 E F, 4 A B, 4 C D, 4 E F, 7 A B, 7 C D, 7 E F] 

B = [1, 4, 7] 

出力(再利用)配列:

C = [1 A B, 1 C D, 1 E F] after clearing, this array becomes 

C = [4 A B, 4 C D, 4 E F] after clearing, this array becomes 

C = [7 A B, 7 C D, 7 E F] 

これは私がこれまで持っているものです。

#Creating the Reference Array. This works perfectly. 
B = [] 
keywords = open("source.txt", 'r') 
for line in keywords: 
    if "1" in line or "4" in line or "7" in line: 
    reference = line.split() 
    rowName = reference[0] 
    if rowName not in B: 
     B.append(rowName) 

#Creating reusable array. Does not work very well. 
A = [] 
C = [] 
with open("source.txt", 'r') as temp: 
    for line in temp: 
     A.append(line) 
for item in B: 
    for item in line in A: 
     print line 
     C.append(line) 
     print C 
     del C[:] 

ご協力いただきありがとうございます。

+0

あなた 'A'、 'B'& 'C'されています_lists_(Pythonには、少し異なる配列オブジェクトもあり、Numpy配列もあります)。現在書かれているように、あなたの 'A'と' C'は有効なPythonではありません。彼らは文字列を含むはずだと思われるので、修正する必要があります。この作業は、['groupby'](https://docs.python.org/3/library/itertools.html#itertools.groupby)を使用する方が簡単です。 –

+0

'for line in A'は無効な構文です。 – chthonicdaemon

+1

ここで意図していたものとまったく同じではない、有効で有効な構文です。 – chthonicdaemon

答えて

0

あなたはただこれにfilterを使用していますか?

考える:

>>> A = ['1 A B', '1 C D', '1 E F', '4 A B', '4 C D', '4 E F', '7 A B', '7 C D', '7 E F'] 

をあなたは、文字列の先頭の要素によってフィルタリングすることができます:

>>> filter(lambda s: s[0]=='1', A) 
['1 A B', '1 C D', '1 E F'] 
>>> filter(lambda s: s[0]=='4', A) 
['4 A B', '4 C D', '4 E F'] 
>>> filter(lambda s: s[0]=='7', A) 
['7 A B', '7 C D', '7 E F'] 

あるいは、

>>> for e in ('1', '4', '7'): 
... print filter(lambda s: s.startswith(e), A) 
... 
['1 A B', '1 C D', '1 E F'] 
['4 A B', '4 C D', '4 E F'] 
['7 A B', '7 C D', '7 E F'] 
+0

私が提供した例はその印象を与えるかもしれませんが、私が扱っているデータの量は膨大であり、すべてのフィルタを非常に効率的にコーディングすることは非常に非効率的です。 –

+0

フィルタをハードコードする必要はありません。私はちょうどその使用の例を示しています。 – dawg

1

は統一特性は最初のフィールドであることであると仮定すると、 Cのそれぞれの周りに同じと、自分のデータファイルを作ります:

source.txt: 
1 A B 
1 C D 
1 E F 
4 A B 
4 C D 
4 E F 
7 A B 
7 C D 
7 E F 

我々は一度だけファイルを読んで、行くように私たちは、グループを構築することができます:

from operator import itemgetter 
from itertools import groupby 

lines = (line.strip().split() for line in open('source.txt')) 
for leadingitem, group in groupby(lines, itemgetter(0)): 
    C = list(group) 
    print(C) 

を出力

[['1', 'A', 'B'], ['1', 'C', 'D'], ['1', 'E', 'F']] 
[['4', 'A', 'B'], ['4', 'C', 'D'], ['4', 'E', 'F']] 
[['7', 'A', 'B'], ['7', 'C', 'D'], ['7', 'E', 'F']] 
+0

'groupby'答えをくれてありがとう。私はOPのサンプルデータを修正した後にそれを行うつもりだった... :) –